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   157 / 177
(#) kapu48 válasza noi hozzászólására (») Márc 17, 2021 /
 
Rosszul kalkulálsz! Mert az ADC1 és ADC2 bemenetei közösek, ezért csak 2*8-al számolhatsz.
Plusz az ADC3, 8 bemenete.
Szerintem: 2.4 * 8 / 3 = 6.4

Ha ezt DMA-val olvasód be egy tömbbe, akkor már csak a kiértékeléssel kel foglalkoznod.
A hozzászólás módosítva: Márc 17, 2021
(#) kapu48 válasza kapu48 hozzászólására (») Márc 17, 2021 /
 
De itt talán érthetőbben el mutogatja: Bővebben: Link
Hozzá fűznem, hogy akár 8 csatornát is be állíthatsz egy ADC-re.
És mind a három ADC mehet egyszerre.
(#) benjami válasza noi hozzászólására (») Márc 17, 2021 /
 
Lehet, hogy szűklátókörű vagyok, de én nem látom értelmét 10ksample/sec-nél nagyobb mintavételezést használni. A belinkelt képeden egy kocka (vagy inkább négyzet) 1msec időtartamot jelent (ha jól tippelek). A 10ksample/sec az kockánként 10 mintát jelent. kizárt, hogy ez kevés legyen (szerintem semennyit nem javulna a pontosság, ha ennél magasabb mintavételi frekvenciát használsz). Ehhez meg bőven elegendő lenne az SPI ADC (szerintem létezik az 12, vagy akár még 16 bitesben is). Ezzel a módszerrel teljesen külön lehetne választani a kontrollertől a mérő részt tartalmazó műveleti erősítőket, AD átalakítókat és az egyéb ahhoz tartozó dolgokat.
(#) Peter65 válasza noi hozzászólására (») Márc 17, 2021 /
 
Szerintem előbb a feladathoz szükséges paramétereket kellene specifikálnod. Az iparban legfeljebb a 20. felharmonikusig (1kHz) szokás foglalkozni az áram felharmonikusokkal, azaz teljesen fölösleges 10ksmp-nél nagyobbal mintavételezni. Ha túlmintavételezni szeretnél a felbontás javítás/zajelnyomás miatt, akkor esetleg lehet nagyobb.
Szerintem fontold meg amit Benjamin javasolt. Én biztosan azt a megoldást választanám, hogy a hálózati feszültség szinten lenne az ADC, vagy inkább több kisebb ADC-s mikrovezérlőt használnék, amiben az egyes méréseknek az offszetelést elvégezném, az esetleges túlmintavételezést kiértékelném, és valamilyen soros felületen átküldeném az aktuális mintát.
(#) noi hozzászólása Márc 18, 2021 /
 
Köszönöm a sok hasznos hozzászólást!

Itt van egy project, ami az eredeti EmonTx megoldásban használt 4 csatornát bővíti fel 12 csatornásra, gyorsabb proceszorral (Ardiuno Due):
Bővebben: Link
Itt a 3 fázisból kettő feszültségét csak becsüli, én azt is mérném.
Van kb. 40 áramköröm a házban.

Aliexpressen nem találok releváns SPI/I2C sok csatornás ADC modult

Az OpenEnergyMonitor oldalon azt írja, hogy 2,5 KSPS-vel tud egyszerre feszültséget és áramot mérni, sima Arduinoval (ATmega328).

Ha csatornánként tudok 10 KPSP-vel mérni (ahogy javasoljátok), az elég lesz (100 mérés/fél hullám).
Tehát egy STM32F407VET6 procinak van 3 darab 12-bites ADC-je, összesen 16 csatorna (láb). Az ADC1 és ADC2 16 csatornás, az ADC3 8, csatolt képen a közösítések. Ezzel mekkora sebességet tudok elérni, csatornánként, DMA segítséggel, ha mind a 16 csatornán folyamatosan mérek? kapu48 számítását jól látom, hogy 6,4 MSPS?

És akkor a csatorna bővítés vagy külső ADC modullal (amit még nem találtam, csak MCP3008-at, külön IC-ként), vagy multiplexer, vagy több lábú STM32 (drágák), vagy több darab STM32-vel lenne megvalósítható...
(#) ha1drp válasza noi hozzászólására (») Márc 18, 2021 / 1
 
Szerintem félreérted. A kontrollerben 3 db ADC van. Ezek egyenként max. 2.4 millió konverzióra képesek másodpercenként. Egy ADC-hez több bemenetet tudsz felhasználni, de ha több bemenetet használsz, akkor a konverzió egymás után fog végrehajtódni, úgy mintha egy multiplexerrel egyesével kapcsolnád a bemeneteket az ADC elé. Természetesen ekkor az első és az utolsó mintavételezés között idő telik el, fázishiba keletkezik.
Sajnos az STM ADC-je igen összetett, jól át kell olvasni hozzá az adatlapot, meg kell érteni a különböző módokat, beállításokat. Az arduino analogRead STM függvénye nem megfelelő a feladathoz.
(#) kapu48 hozzászólása Márc 18, 2021 /
 
Ha szétszórton több helyen és lehetőleg pontosan akarsz mérni?
Akkor inkább több kisseb kártyára szavazok, szétszórva lehetőleg minél közelebb elhelyezni őket a mérendő helyhez. Hogy minél kevesebb zajt vegyenek fel a mérő vezetékek.

Például: ST STM32G4 Nucleo-32 Bővebben: Link

Aránylag olcsók, és mégis gyorsak a 170MHz
A hozzászólás módosítva: Márc 18, 2021
(#) Jonni hozzászólása Márc 19, 2021 /
 
Blue pill.
Itt azt írják, hogy
Idézet:
„Output +3.3V @ 300mA”
ezt a 300mA-t hogy kell érteni? Ennyit tudnak kiadni a digital output lábak? Egyenként? Összesen?
(#) vargham válasza Jonni hozzászólására (») Márc 19, 2021 /
 
Az a regulator szekcióban szerepel. Tehát az 5V->3V3 IC tud ennyit.
A mikrokontroller terhelhetőségéhez nyisd meg az adatlapját, az Absolut maximum ratings fejezetben megtalálod, amit keresel.
A hozzászólás módosítva: Márc 19, 2021
(#) Jonni válasza vargham hozzászólására (») Márc 19, 2021 /
 
Frekvenciafüggő a végeredmény.
16 MHz 14.9mA
72 MHz 50.3mA
(#) jefflynn válasza Jonni hozzászólására (») Márc 19, 2021 /
 
Szerintem ez az áramfogyasztása. Az valóban frekvenciafüggő.
(#) vargham válasza Jonni hozzászólására (») Márc 19, 2021 /
 
Az a CPU mag fogyasztása GPIO terhelés nélkül.
Téged a 37. oldal érdekel.
(#) Jonni válasza vargham hozzászólására (») Márc 20, 2021 /
 
Köszi. Akkor ezt elnéztem
(#) david10 hozzászólása Márc 22, 2021 /
 
Sziasztok,
Nekem is lenne egy kérdésem az ADC-vel kapcsolatban.
NUCLEO-072RB panel GND és PA0 pinek közé bekötöttem egy ellenállásosztó kimenetét amivel tápfeszültséget szeretnék mérni.
A gond az hogy nagyon pontatlanul mér a 12 bites ADC.
Ha a port kap 130mV-ot olyankor az ADC értéke (0-4095 skálán) 0 és 170 között ugrál.
Oszcillószkópom nincs, de szerintem nem a jellel van a baj mivel a feszültségosztó direkt a 470µF-os szűrőkondenzátor közé van bekötve és a feszültségosztó kimenetén (a port/GND között) is van egy 10nF-os kondenzátor, de így is ugrál a mért érték.
Ha letestelem vagy 3.3v-ra kötöm a PA0 lábat olyankor fix 0 / 4095 értéket ad vissza az ADC.
Az ADC-t polling módban használom.
Szerintetek hogyan lehetne az ADC pontosságán javítani?
A választ előre is köszönöm.
A hozzászólás módosítva: Márc 22, 2021
(#) jefflynn válasza david10 hozzászólására (») Márc 22, 2021 /
 
Két lehetőség van. Az első a hardveres probléma, kontakthiba, forrasztási hiba, ezt mi kiszűrni távolról nem tudjuk. A másik, hogy valamit elrontasz az ADC beállításakor, olvasásakor. Tedd fel a forrást, legalább azt ami GPIO-t és ADC-t inicializálja.
(#) david10 válasza jefflynn hozzászólására (») Márc 22, 2021 /
 
Köszönöm a válaszodat, sajnos HW hibának néz ki, ezért nem fogok vele itt spamelni, a TL431 által kiadott feszültséget stabilan méri.

Egy tanács arra az esetre ha más is hasonlóan járna: TL431-el és egy ellenállással érdemes építeni egy 2.5v-os tápot, azt rákötve a GPIO-ra el lehet dönteni hogy pontosan mér-e az uC.

Szerk: a TL431 által kiadott 2.5V-os jelt 3006-3009 közötti értéknek méri a 12 bites ADC, ami bőven megfelel az elvárásnak .
A hozzászólás módosítva: Márc 22, 2021
(#) dB_Thunder hozzászólása Máj 4, 2021 /
 
Sziasztok!

Valakinek van tapasztalata Seeeduino XIAO-val? Nem tudok rá feltölteni progit az a problémám!
Vettem egy újat a TME-ből, felraktam EZT a drivert mert a leírás szerinti FTDI drivert nem telepítette.
COM port beállítva, alaplap infó olvasható, de a feltöltésnél csak homokóra van, aztán sikertelen.

Valakinek építő jellegű gondolata?
(#) bbalazs_ hozzászólása Máj 27, 2021 /
 
Sziasztok!
Gondom van egy ssd1306 kijelzővel. Kiderült, hogy az I2C órajele nem jó, kb. 100us a clk periódus ideje szkópon nézve.
Hogyan tudnám beállítani, illetve az initnél a speed miért nem megy a beállított 100000-el?
Ha egy szájbarágós példát kaphatnék... valami periféria órajel a megoldás, de a neten lelt példán nem tudtam elmenni. C-ben kellene, gd32f103rtc6-ra.
Előre is köszönöm.
(#) vargham válasza bbalazs_ hozzászólására (») Máj 28, 2021 /
 
Most hogy néz ki a programod?
(#) bbalazs_ válasza vargham hozzászólására (») Máj 28, 2021 /
 
Melyik c része vagy headerje? Mert ez egy jó nagy progi...
Az I2C init:

  1. void I2C_Init(void)
  2. {
  3.  
  4.   __HAL_RCC_I2C1_CLK_ENABLE();
  5.   hi2c1.Instance = I2C1;
  6.   hi2c1.Init.ClockSpeed = 400000;
  7.   hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  8.   hi2c1.Init.OwnAddress1 = 0;
  9.   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  10.   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  11.   hi2c1.Init.OwnAddress2 = 0;
  12.   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  13.   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  14.   HAL_I2C_Init(&hi2c1);
  15.  
  16.   GPIO_InitTypeDef GPIO_InitStruct;
  17.  
  18.     __HAL_RCC_DMA1_CLK_ENABLE();
  19.     __HAL_RCC_GPIOB_CLK_ENABLE();
  20.  
  21.     /**I2C1 GPIO Configuration
  22.     PB08     ------> I2C1_SCL
  23.     PB09     ------> I2C1_SDA
  24.     */
  25.     GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
  26.     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  27.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  28.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  29.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  30.  
  31.     /* Peripheral clock enable */
  32.     __HAL_RCC_I2C1_CLK_ENABLE();
  33.     __HAL_AFIO_REMAP_I2C1_ENABLE();  //ez a lényeg
  34.     __HAL_RCC_I2C1_FORCE_RESET();
  35.     __HAL_RCC_I2C1_RELEASE_RESET();
  36. }
A hozzászólás módosítva: Máj 28, 2021
(#) vargham válasza bbalazs_ hozzászólására (») Máj 28, 2021 /
 
Honnan kapja az MCU az órajelet?
Mennyi a SYSCLK?
(#) bbalazs_ válasza vargham hozzászólására (») Máj 28, 2021 /
 
Köszönöm, hogy foglalkozol a gondommal. Sajnos nem tudom, a kódrészletet tudom bemásolni.
  1. /** System Clock Configuration
  2. */
  3. void SystemClock_Config(void) {
  4.   RCC_OscInitTypeDef RCC_OscInitStruct;
  5.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  6.   RCC_PeriphCLKInitTypeDef PeriphClkInit;
  7.  
  8.   /**Initializes the CPU, AHB and APB busses clocks
  9.     */
  10.   RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI;
  11.   RCC_OscInitStruct.HSIState            = RCC_HSI_ON;
  12.   RCC_OscInitStruct.HSICalibrationValue = 16;
  13.   RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;
  14.   RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI_DIV2;
  15.   RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL16;
  16.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
  17.  
  18.   /**Initializes the CPU, AHB and APB busses clocks
  19.     */
  20.   RCC_ClkInitStruct.ClockType      = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  21.   RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;
  22.   RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;
  23.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  24.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  25.  
  26.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
  27.  
  28.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  29.   PeriphClkInit.AdcClockSelection    = RCC_ADCPCLK2_DIV8;  // 8 MHz
  30.   HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
  31.  
  32.   /**Configure the Systick interrupt time
  33.     */
  34.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
  35.  
  36.   /**Configure the Systick
  37.     */
  38.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  39.  
  40.   /* SysTick_IRQn interrupt configuration */
  41.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  42. }
(#) bbalazs_ válasza bbalazs_ hozzászólására (») Máj 28, 2021 /
 
Nem lehet, hogy a DMA kavar be? Az eredeti kódban a követése (debug) I2C módban így volt megoldva.
(#) bbalazs_ válasza bbalazs_ hozzászólására (») Máj 28, 2021 /
 
Köszönöm, megoldódott, annyit kellett tenni, hogy a

I2C1->CCR = 0x28;

sort beszúrni az initbe. Direkt módon izélgetni a regisztert

Én hülye meg a rutinok között keresgéltem, hogy a c-ben biztosan van valami beállítás.
(#) bbalazs_ hozzászólása Máj 30, 2021 /
 
Urak, újabb gondom van: a sprintf funkció nem írja ki a float számokat egyáltalán, üres string van helyette. Visual Studióban, HAL alatt használnám stm32f103rtc-hez.
A neten azt írják, hogy -u paranccsal be kell tenni, hogy float is legyen, de amit javasolnak, olyan file-om nincs. Ezek a fordítási üzenetek:


  1. PACKAGES:
  2.  - framework-stm32cube 2.0.200813
  3.  - tool-ldscripts-ststm32 0.1.0
  4.  - toolchain-gccarmnoneeabi 1.70201.0 (7.2.1)
  5. Warning! Cannot find a linker script for the required board! Firmware will be linked with a default linker script!
  6. LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
  7. LDF Modes: Finder ~ chain, Compatibility ~ soft
  8. Found 11 compatible libraries
  9. Scanning dependencies...
  10. No dependencies
  11. Building in release mode
  12. Warning! '-Wl,-T' option for specifying linker scripts is deprecated. Please use 'board_build.ldscript' option in your 'platformio.ini' file.
  13. Compiling .pio\build\Roller\src\bldc.o
  14. Compiling .pio\build\Roller\src\main.o
  15. Linking .pio\build\Roller\firmware.elf
  16. Checking size .pio\build\Roller\firmware.elf
  17. Building .pio\build\Roller\firmware.bin
  18. Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
  19. RAM:   [=         ]   5.7% (used 2804 bytes from 49152 bytes)
  20. Flash: [=         ]   8.0% (used 20972 bytes from 262144 bytes)
  21. =========================================================
(#) icserny válasza bbalazs_ hozzászólására (») Máj 30, 2021 /
 
STM32CubeIDE esetén "-u _printf_float" kapcsolót látok a lebegőpontos kiírást használó projekteknél. A runtime library egyébként "Reduced C" (--specs=nano.specs).

A Visual Studióhoz nem tudok hozzászólni.
(#) benjami válasza bbalazs_ hozzászólására (») Máj 30, 2021 /
 
Én csak CubeIDE-hez tudok hozzászólni, ott project properties / C/C++ build / settings / MCU settings / use float with printf... : pipa be.
Hogy a VS-ben ezt lehet bekapcsolni, azt már neked kell megtalálni.
(#) bbalazs_ hozzászólása Máj 30, 2021 / 1
 
Köszi, közben meg is lett (netes info):
Ezt kellett betenni a platformio.ini-be:

-Wl,--undefined,_printf_float

Ha még lenne hajam, most tépkedtem volna ki szálanként...
A hozzászólás módosítva: Máj 30, 2021
(#) vargham válasza bbalazs_ hozzászólására (») Máj 31, 2021 /
 
Idézet:
„Ha még lenne hajam, most tépkedtem volna ki szálanként...”

De miért? A float print sok helyet foglal, alapesetben ki van kapcsolva.
(#) bbalazs_ válasza vargham hozzászólására (») Máj 31, 2021 /
 
A sok ellentmondó információ miatt. Mivel teljesen kezdő vagyok a c környezetben, kénytelen vagyok a neten terjedő infó-morzsákra hagyatkozni. A kis kijelző esetében pl. kénytelen voltam az én korábbi, jól működő assembly programomból részeket átvenni, mert az eredeti nem működött - az inicializálása is már rossz volt.
És már csak nem tölthetem az egész szép ifjúságomat manualok olvasásával.
Következő: »»   157 / 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