Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   134 / 177
(#) vargham válasza david10 hozzászólására (») Ápr 14, 2019 /
 
Read out protection?
(#) rolandgw válasza david10 hozzászólására (») Ápr 14, 2019 /
 
A 208-as nem túl régi darab, frissítened kellene az ST link-et, ha lehet a klónt.
Bővebben: Link
Csak törlésre lesz lehetőséged az STVP-vel, biztosan be van kapcsolva a védelem.
Itt egy jó sorozat kezdésnek:
Bővebben: Link
A hozzászólás módosítva: Ápr 14, 2019
(#) david10 válasza Peter65 hozzászólására (») Ápr 14, 2019 /
 
Köszönöma a válaszokat!
Az ST Visual Develop-al próbáltam meg kiolvasni az MCU-n található tartalmat.
Ha kódvédett lenne, akkor nem kellene kiírja, hogy kódvédelem van? Vagy le lenne tiltva a SWIM tiltva?
Ha a programozót kihúzom és újra bedugom, akkor az első műveletkor alacsonyra vált a reset láb.

111.png
    
(#) david10 válasza rolandgw hozzászólására (») Ápr 14, 2019 /
 
Köszi a linkeket.
Megpróbáltam frissíteni, lesz ami lesz alapon, V28 FW volt rajta, feltette rá a V33-at, de továbbra is ugyanaz a jelenség, ill. hibaüzenet.
Ilyen CAN modulból az év folyamán kb. 50-60 darabot tervezek még lecserélni, ha valakinek van szüksége ilyenre, akkor tudok adni.
(#) Sanyesz5 hozzászólása Ápr 16, 2019 /
 
Sziasztok!

A mikrovezérlők világában kezdő vagyok, pár apróságot már programoztam.
Egy olyan kérdésem lenne, adott egy stm32f103 az egyik bemenetére kapna egy példának okáért 10kHz-es szinuszt, egy másik bemenetén ugyanezt, a két jel közti fázistolást kellene mérnem (remélem jól írtam). Mennyire kivitelezhető ez? Próbáltam erre minta programot keresni de semmi, abból már én is ki tudnék indulni valamerre de így a nulláról ez nehéz.

Előre is köszönöm!
(#) kapu48 válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 / 1
 
Olyan példát nem is fogsz találni ami, pont egy neked megfelelő problémát old meg!

Viszont itt van 2 oldallal visszább közöltem:
Bővebben: Link
Csak az igényeidhez kel igazítani! Kicsit bele firkáltam, hogyan képzelem.
A 2 csatornás analóg mérések sorozata DMA-val:
  1. /*              Multichannel_ADC_DMA.ino
  2.   Modositva kapu48    2019. 01.
  3.   This example shows how to use the ADC multichannel (scan), single conversion mode.
  4.  
  5.   A scan of all the channels is triggered by a timer interrupt so the sample time is
  6.   regular and predictable. The DMA then transfers the data into a buffer.
  7.  
  8.   Since the ADC conversion and transfer to the buffer do not require the main processor,
  9.   it is kept free to service other tasks and do useful work on the data.
  10.  
  11.   When testing different configurations and sample rates, keep an eye on the timer and
  12.   DMA ISR counts. If the timer interrupts faster than the ADC/DMA then these values
  13.   will get out of sync. At high sample rates they may be out by a few counts as they
  14.   get updated in between reading the values, but they shouldn't drift further apart
  15.   the longer the sketch runs.
  16. */
  17.  
  18. #include "libmaple/dma.h"
  19.  
  20. static const uint8_t LED = PC13;
  21.  // Beállíthatod milyen frekvevciával ismédlödjönek a mérés sorozatok:
  22. static const uint32_t SAMPLE_FREQ = 50000;
  23. //static const uint8_t adc_pins[] = {PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7};
  24. //static const uint8_t adc_pins[] = {PA0,PA1,PA2};
  25. static const uint8_t adc_pins[] = {PA0,PA1};
  26. static const uint8_t num_adc_pins = sizeof(adc_pins)/sizeof(adc_pins[0]);
  27. // Ennyi mérés lessz egy sorozatban:
  28. static const uint8_t num_adc_repeat = 32;
  29. static const uint8_t num_adc_buffer = num_adc_pins * num_adc_repeat; // Puffer terület számítás
  30.  
  31. volatile bool transfer_complete = false;
  32. volatile uint16_t next_sample_time = 0;
  33. // Megszakítások számlálása, Ezeknek egyűt kel futni, ha jók az időzítések
  34. volatile uint32_t timer_isr_count = 0;
  35. volatile uint32_t dma_isr_count = 0;
  36. volatile uint32_t Start = 0;
  37. volatile uint32_t Stop = 0;
  38.  
  39. uint16_t adc_buffer[num_adc_buffer];
  40.  
  41. HardwareTimer timer(2);
  42.  
  43. void set_adc(adc_dev* dev);
  44. void set_adc_channels(adc_dev* dev, const uint8_t* pins, uint8_t Length);
  45. void set_dma(uint16_t* buf, uint16_t bufLen, uint32_t dmaFlags, voidFuncPtr func);
  46. void set_timer(HardwareTimer* timer, voidFuncPtr func);
  47.  
  48. void setup()
  49. {
  50.   Serial1.begin(115200);
  51.   pinMode(LED, OUTPUT);
  52.  
  53.   for(uint8_t i = 0; i < num_adc_pins; i++)
  54.   {
  55.     pinMode(adc_pins[i], INPUT_ANALOG);
  56.   }
  57.  
  58.   delay(500);    // wait for the serial console window
  59.  
  60.   // set the dma first
  61.   //set_dma(adc_buffer, num_adc_pins, (DMA_CCR_MINC | DMA_CCR_CIRC | DMA_TRNS_CMPLT), DMA1_CH1_isr);
  62.   set_dma(adc_buffer, num_adc_buffer, (DMA_CCR_MINC | DMA_CCR_CIRC | DMA_TRNS_CMPLT), DMA1_CH1_isr);
  63.   set_adc(ADC1);
  64.   start_conversion(ADC1);          // start the first adc conversion
  65.   set_timer(&timer, timer_isr);    // start the timer for the next conversion
  66.  
  67. //  Serial.println("Sample,CH0,CH1,CH2,CH3,CH4,CH5,CH6,CH7");
  68. //  Serial1.println("Sample,CH0,CH1,CH2");
  69.   Serial1.println("Sample,CH0,CH1");   
  70. }
  71.  
  72. void loop()
  73. {
  74.   static uint32_t dma_count;
  75.   static uint32_t timer_count;
  76.   static uint32_t sumADC[num_adc_pins];
  77.  
  78.  
  79.   // Store these values as they will update while we are trying to print them
  80.   dma_count = dma_isr_count;
  81.   timer_count = timer_isr_count;
  82.  
  83. //  Serial1.print(dma_count);
  84. //  Serial1.print(':');
  85. //  Serial1.print(timer_count);
  86. /*  
  87.   for(uint8_t i = 0; i < num_adc_pins; i++){
  88.     sumADC[i] = 0;
  89.   }
  90. */
  91.   if(transfer_complete == true){ // Ha jelzett a DMA, hogy készvan a mérésselk: kiértékeled
  92.     for(uint8_t i = 0; i < num_adc_buffer; i++)
  93.     {
  94. //    Serial1.print(i);
  95. //    Serial1.print(": ");
  96. //    Serial1.print(adc_buffer[i]);  
  97. // Itt összegzés helyett számolhatsz, a tőmben minden páratlan helyen van az ADC0 mérések értéke.
  98. // időegységek: eltelt_usec= (Stop - Start)/2, egyMeres_usec = eltelt_usec / (num_adc_buffer/2)
  99. // Megkeresed a tőmben a mérés csúcsokat a kapott index értékekből számolhatsz eltelt időtöt
  100. //      sumADC[0] += adc_buffer[i++];
  101. //    Serial1.print(", ");
  102. //    Serial1.print(adc_buffer[i]);
  103. // Itt elvégzed ugyanazt csak a másik ADC1-re    
  104. //      sumADC[1] += adc_buffer[i++];
  105. //    Serial1.print(", ");
  106. //    Serial1.println(adc_buffer[i]);    
  107. //    sumADC[2] += adc_buffer[i];
  108.  
  109.     }
  110.   transfer_complete = false; //Letiltod a további számolást, majd a DMA_isr engedélyezi újra
  111.   }
  112. //Itt pedig az alkalmazott szögfüggvényt kinézed valami tankönyvből!
  113. //  Serial1.print("Sum: ");
  114. /*
  115.   for(uint8_t i = 0; i < num_adc_pins; i++){
  116.     Serial1.print(i);
  117.     Serial1.print(": ");
  118.     Serial1.print(sumADC[i]/num_adc_repeat);
  119.     Serial1.print(" , ");
  120. */
  121.   }
  122.  
  123. }
  124.  
  125. /*
  126.     Interrupt handlers
  127. */
  128. static void DMA1_CH1_isr() {
  129.   Stop = micros();    // mérés vége
  130.   transfer_complete = true;
  131.  
  132.   ++dma_isr_count;
  133. }
  134.  
  135. static void timer_isr()
  136. {
  137.   ++timer_isr_count;
  138.   timer.setCompare(TIMER_CH1, ++next_sample_time);  // set next sample time
  139.   transfer_complete = false;
  140.   start_conversion(ADC1);
  141.   Start = micros(); // mérés kezdet
  142. }
  143.  
  144. void set_adc(adc_dev* dev)
  145. {
  146.   adc_calibrate(dev);
  147.   //adc_set_sample_rate(dev, ADC_SMPR_1_5);
  148.   adc_set_sample_rate(dev, ADC_SMPR_41_5);
  149.   set_adc_channels(dev, adc_pins, num_adc_pins);
  150.   dev->regs->CR2 |= ADC_CR2_DMA;     //enable ADC DMA transfer
  151.   dev->regs->CR1 |= ADC_CR1_SCAN;    //Set the ADC in Scan Mode
  152. }
  153.  
  154. void set_adc_channels(adc_dev* dev, const uint8_t* pins, const uint8_t num_pins)
  155. {
  156.   /*
  157.    * From libraries/STM32ADC/src/utility/util_adc.c
  158.    */
  159.   uint8_t channels[num_pins];
  160.   uint32_t records[3] = {0,0,0};
  161.  
  162.   //convert from pins to channels
  163.   for (uint8_t i = 0; i < num_pins; i++)
  164.   {
  165.     channels[i] = PIN_MAP[pins[i]].adc_channel;
  166.   }
  167.  
  168.   //write the length
  169.   records[2] |= (num_pins - 1) << 20;
  170.  
  171.   //i goes through records, j goes through variables.
  172.   for (uint8_t i = 0, j = 0; i < num_pins; i++)
  173.   {
  174.       if ((i != 0) && (i%6 == 0))
  175.       {
  176.         j++;
  177.       }
  178.       records[j] |= (channels[i] << ((i%6)*5));
  179.   }
  180.  
  181.   //update the registers inside with the scan sequence.
  182.   dev->regs->SQR1 = records[2];
  183.   dev->regs->SQR2 = records[1];
  184.   dev->regs->SQR3 = records[0];
  185. }
  186.  
  187. void start_conversion(adc_dev* dev)
  188. {
  189.   dev->regs->CR2 |= ADC_CR2_SWSTART;
  190. }
  191.  
  192. void set_dma(uint16_t* buf, uint16_t bufLen, uint32_t dmaFlags, voidFuncPtr func) {
  193.   dma_init(DMA1);
  194.  
  195.   if (func != NULL) {
  196.     dma_attach_interrupt(DMA1, DMA_CH1, func);
  197.   }
  198.  
  199.   dma_setup_transfer(
  200.     DMA1,
  201.     DMA_CH1,
  202.     &ADC1->regs->DR,
  203.     DMA_SIZE_16BITS,
  204.     buf,
  205.     DMA_SIZE_16BITS,
  206.     dmaFlags
  207.   );
  208.   dma_set_num_transfers(DMA1, DMA_CH1, bufLen);
  209.   dma_enable(DMA1, DMA_CH1);
  210. }
  211.  
  212. void set_timer(HardwareTimer* timer, voidFuncPtr func)
  213. {
  214.   timer->pause();
  215.   timer->setPrescaleFactor(72000000u / SAMPLE_FREQ);
  216.   timer->setOverflow(65535);
  217.  
  218.   timer->setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE);
  219.   timer->setCompare(TIMER_CH1, 1);  // initial compare value for the timer
  220.   next_sample_time = 1;             // sync next_sample_time with the compare value
  221.  
  222.   if (func != NULL)
  223.   {
  224.     timer->attachInterrupt(TIMER_CH1, func);
  225.   }
  226.  
  227.   timer->refresh();
  228.   timer->resume();
  229. }

Bár nem ezzel kezdeném a programozás tanulását!
Azért remélem nem voltam túl bonyolult?
A hozzászólás módosítva: Ápr 17, 2019
(#) Sanyesz5 válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
Köszönöm, megnézem, én sem ezzel kezdeném erre van szükségem.
(#) kapu48 válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 /
 
Sok sikert!

Bár még rengeteg probléma felmerülhet, amiket nem említettem.
Pl.: Megkel oldani az ADC referencia feszültség komoly zajszűrését.
Mert a túl zajos mérést nehéz lesz kiértékelni.
Ki kel kísérletezni a megfelelő időzítéseket, hogy két mérés között eltud végezni a kiértékelést.
(Ezért is melözném a LED-ek villogtatását!)

És közben még felmerülhet, hogy nem elég gyors a programunk!
Akkor majd elkel gondolkozni további gyorsításon.
A hozzászólás módosítva: Ápr 17, 2019
(#) kapu48 válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
(#) rolandgw válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
Megkel: tészta.
Kikel: palánta.
Elkel: vevőre talál.
El tudd végezni..
(#) kapu48 válasza rolandgw hozzászólására (») Ápr 17, 2019 /
 
Elvetettem a magot.
Ha a kitartása is van olyan nagy, mint az önbizalma?
Akkor bízzunk a sikerében!

A hozzászólás módosítva: Ápr 17, 2019
(#) djusee válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
Sziasztok. Arduino után én is elkezdtem körbeszagolgatni az ARM processzorokat, Nucleo F446RE -re esett a választás(használtan licit oldal ). Szerencsére Eclipse -et használtam eddig is, erre is tudom. Egyenlőre olyan fázisban vagyok hogy összejött az ST-Link es debug dolog és ámulok-bámulok, vizsgálgatom a blink kódomat hogyan dolgozik . A legnagyobb gondom ha nincs megoldásra váró probléma akkor szükségtelennek érzem a fejlesztést(tanulást). Nektetek ez hogyan müködik? Egyenlöre olvasgatom a topikot és kisérletezgetek.
(#) kapu48 válasza djusee hozzászólására (») Ápr 17, 2019 /
 
Kérdés miben fejlesztel? Mert elég sok lehetőség van.
Szerintem menj végig a példaprogramok kiismerésén:
Bővebben: Manual.pdf
(#) Sanyesz5 válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
Kapu48 küldtem privátot
(#) djusee válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
Eclipse fejlesztőkörnyezet -ben(ez ami bevált Linux alatt), az Arduinos C++ -al kezdtem de egyre többször használom inkább a sima C könyvtárakat, parancsokat, asm -et nem használtam. Az egész csak hobbi, szórakozás képpen indult pár éve de egyre jobban magával ragad, köszönöm a doksit, át fogom olvasni ahogy az idöm engedi és ha olyan kérdésem merülne fel amire Google nem lenne hajlandó válaszolni akkor fel fogom tenni itt .
Köszönöm
(#) kapu48 válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 /
 
Bocsi, de én itt válaszolok! Mivel a többi olvasónkkal szemben az a ferr!

Youtuben rögtön látod a problémákat.
Már csak megkel oldani őket!
Látható, hogy a drága szkópon milyen zajos a mérő jel, az olcsó alkalmazásodban ez csak nagyobb lesz.
Fejlesztéshez kevés az oled kijelző, az majd jó lesz a késztermékhez.
Fejlesztéshez soros USB illesztő kel, és az eredményeket a PC soros monitorán megjeleníteni.
Ha pl. csinálsz analog mérés sorozatot 2 csatornán, 2 * 100 mérést.
Ehhez kel 2db. tömb[100]
Az már 200 eredmény, amit kikel listáznod, hogy lássad, mit lehet vele kezdeni.
Majd for ciklusban végigmész a tömbökön, összehasonlítgatod az egymást követő értékeket.
Ez nagyban fog függeni a mérés zajosságától, hogy megtaláld a feszültség csúcsokat.
Újabb tömbökben eltárolod a csúcsok index mutatóját, amit majd felhasználhatsz az időállandók kiszámításához.
Amit már fentebb körvonalaztam. És a frekvencia körszámlálást, amit a Youtubon az analóg szkóp végez?
Ez más kérdés. Mit szeretnél? Szinusz hullámokat megjeleníteni? Mert akkor neked 2 sugaras szkóp kel.
(#) Sanyesz5 válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
Leírtam, ket színuszt mérnék, a kettö fázistolásat kell mérni, nem tudom értjük e egymást, szkóp van, de ezzel kellene ezt megvalósítani. Bővebben: Link
(#) kapu48 válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 /
 
Itt sajnos nem tudsz +/- szinusz jelet mérni! És középértéket is nehezebb megtalálni, mint a felső vagy alsó csúcsértéket.
Ezért javasoltam a felső csúcsérték keresését. Ami szerintem megadja ugyanazt az időeltolás értéket.

Vagyis kel neked tárolós kétsugaras szkóp, grafikus kijelzés nélkül, csak az időállandók kiíratásával.
Ilyen alkalmazást találsz többet is akár itt az oldalon. Csak visszakel keresned
A hozzászólás módosítva: Ápr 17, 2019
(#) Peter65 válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 /
 
Szia!
Ha nekem kéne; akkor a stabilabb 10kHz-re rá szinkronoznám a processzort PLL szerűen, a másik 10kHz-es jel Fourier alap-harmonikusának sin és cos együtthatóit számolnám ki, amiből megvan a fázishelyzet. Ez a megoldás nem annyira kényes a zajokra, dc összetevőre, és viszonylag kevés mintával is viszonylag pontos eredményt adhat. Ehhez a megoldáshoz nem biztos, hogy az STM32F103 a legjobb választás.
(#) vargham válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 /
 
Még nem csináltam ilyet, de ha nekem kellene így indulnék neki:
Ebben az MCU-ban 2 ADC egység van, amelyek EGYSZERRE képesek mintavételezni.
Mindkettő ADC-t ugyanakkora frekvenciával használnám, és a mérések hossza is megegyezne. Így pontosan lehet tudni, hogy melyik két mérés történt egy időben.
Az egyik jel menne az egyik ADC-be, a másik a másikba. Mindkét ADC mintáit DMA másolná a memóriába.
Minimumot vagy maximumot kell keresni mindkettő adatsorban. A kettő csúcsérték közötti minták számából pedig ki lehet számolni az időkülönbséget.
(#) kapu48 válasza vargham hozzászólására (») Ápr 17, 2019 /
 
Igen ez már a következő szint az erőben, aztán jön a DMA dupla puffereléssel.

Azzal a kikötéssel, hogy itt a minimum szint bele merül a 0-ába, vagyis mikor nincsen jel.
Azon nincsen mit kiértékelni.
(#) vargham válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
Sanyesz5 sehol sem írta, hogy a szinuszos feszültség értéke bárhol is lecsökkenne 0 V alá, vagy felmenne 3.3 Volt fölé... Amennyiben mégis így van, még szüksége lesz egy műveleti erősítőre, amivel az MCU ADC 0-3.3 Voltos tartományába alakítja a jeleket.
(#) kapu48 válasza vargham hozzászólására (») Ápr 17, 2019 /
 
Ezt privátban küldte: Bővebben: Link

De mivel több megoldás is lehetséges a problémára, és többeket is érdekelhet.
Jobbnak láttam itt maradni.
(#) Sanyesz5 válasza kapu48 hozzászólására (») Ápr 17, 2019 /
 
"Ilyen alkalmazást találsz többet is akár itt az oldalon. Csak visszakel keresned " Szia, én lapozom egy jó ideje visszafelé de nem találtam
(#) csatti2 hozzászólása Ápr 17, 2019 /
 
Első körben jó lenne tudni a két szinusz jel elektromos jellemzőit (Upp, ezek külső jelek?, ha igen mennyi az impedancia). Mekkora pontossággal kell a fáziseltolást megmérni?
Ez alapján el lehet dönteni, hogy mekkora és milyen analóg áramkörre van szükség, illetve melyik perifériával kell majd feldolgozni a jeleket (ADC-k ha nincs túl nagy pontosságra igény, ebben az esetben szoftveresen kiszámítható, nagyobb pontosság esetén a jelek megfelelő skálázása után komparátorokkal négyszögjelekké alakítható a nullpontátmenet, majd időzítők bemeneteire kötve pontosan megmérhető a fáziseltolás).
(#) Sanyesz5 válasza csatti2 hozzászólására (») Ápr 17, 2019 /
 
Üdv, adott egy oszcillátor, példának okáért 10kHz (de lehet ez max 30), ennek a jele kimegy a fémkereső adótekercsére, természetesen ezt a jelet az egyik bemeneten mérném, a másik jel, a vevőtekercsen fogott szinusz, ezt a kettőt kellene összehasonlítani. Analóg keresőt építettem már, csak ugye a digitálisnak vannak előnyei. Analógban van vevőerősítő stb, mert a visszavert jel max 10mV, a kimenet az lehet akár 50 volt is, amit persze közvetlen nem tudnék mérni.
(#) rolandgw válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 /
 
Első olvasatra: egy PLL IC open loop módban és ST-vel méred a VCO frekvenciáját.
(#) csatti2 válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 / 1
 
A következő lépés azt eldönteni, hogy elég-e a szoftveresen megállapítható fáziseltolás pontossága vagy nagyobb kellene.
A leggyorsabb mintavételezésed 1Msps ADC-nként az általad választott mikrokontroller esetén (de csak ha nem hajtod ki maxon, mert akkor kevesebb).
Idézet:
„ADC conversion time:
STM32F103xx performance line devices: 1 μs at 56 MHz (1.17 μs at 72 MHz)”

Ebből adódik, hogy a legjobb elméleti felbontásod 3,6 fok (100 lépcsőd van 1 periódus alatt). Ha ez nem elég jó, akkor marad a komparátoros megoldás.
(#) Sanyesz5 válasza csatti2 hozzászólására (») Ápr 17, 2019 /
 
Sok itt az elmélet, de elméletileg 180 fokig kell mérnem csak, itt egy szemléltető kép
(#) csatti2 válasza Sanyesz5 hozzászólására (») Ápr 17, 2019 /
 
Az ábra alapján azt mondanám, maradjunk a komparátoros megoldásnál. Itt egy körülbelüli példa.
Természetesen ne vedd készpénznek, nem tudom pontosan milyen jellemzői vannak a jeleidnek.
Következő: »»   134 / 177
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem