Diskuze - danyk.cz

Vlákno z kategorie: Hlavní diskuze
Celkem 17 odpovědí.


19.01.2020 (23:32:25) K # IP X
milan obalka :
Dumám tu nad ADC u STM32
interní reference po 12bit změření: 1464
kalibrační hodnota uložená v čipu: 1526
vypočet napětí AVCC: 3300 * 1526 / 1464 = 3439mV
změřené napětí na AVCC: 3302mV
Kde je sakra chyba? Nebo to je normální?
20.01.2020 (09:34:50)  # IP X
VroutekB:
Normální hlavně není se ptát na STM32 a nenapsat který z těch asi 500 produktů v téhle řadě. **36
20.01.2020 (13:31:44)  # IP X
RayeR (web) :
No prave, nektere STM32 ani nemaji vnitrni referenci...
20.01.2020 (18:44:36)  # IP X
Martin12:
Měl jsem chybu s měřením vnitřní reference u STM32F030F4 (tuším, nebo jiný v TSSOP20). Problém byl při čtení reference v době přenosu I2C. Řešení bylo použití SPI místo I2C, abych to nemusel moc dlouho zkoumat pač na to nebyl čas. Každopádně s I2C to nešlo, bez něho ano. Výsledná hodnota měla ale chybu >50% hodnoty (výsledek se pohyboval mezi 1,6-3,8V, reálné napájení 3,4V dle nějakého stolního Keysight multimetru. ne jak u tebe <10% což je i dle DS tuším povolená odchylka od té ref. hodnoty jestli se nepletu, ale to jsem taky moc nezkoumal, teď jsem na to jen zběžně koukl, kdyžtak tedy tuto hodnotu prosím opravte **04
20.01.2020 (22:05:58)  # IP X
milan obalka :
Jáj, pardon, STM32F030R8T6... na desce nucleo64.
20.01.2020 (22:11:56)  # IP X
milan obalka :
v datasheetu píšou při teplotě 30°C +-5°C a odchylka +-10mV
Jen cyklicky pomocí DMA měřím a mám nastavený dlouhý vzorjkkování (to taky vyžadují při použití té vnitřní reference)
Hodnoty mi ani nijak nelítají. je teda fakt že u toho teda ještě komunikuji uartem, ale to nemuže snad vadit.
21.01.2020 (02:19:45)  # IP X
RayeR (web) :
Ted este jak je to s tou kalib. konst., vetsinou se u ADC resi offset a zisk, nemam ted cas studovat, co ta konstanta vlastne urcuje, ale necham se tu poucit :)
21.01.2020 (03:40:32)  # IP X
antibalda obalka (web) :
Tak kompenzační tabulku třeba po 10mV, zjistit hodnoty odchylky v určitých bodech rozsahu, pak na to pozvat slečnu interpolaci a výsledek odečítat/přičítat podle potřeby. Takto to dělám standardně - ten ADC vždy kecá.
21.01.2020 (20:23:30)  # IP X
VroutekB:
ADC a DAC prakticky nikdy nekecá a je velmi lineární. Vyjma velmi specifických případů na starých F2 a F4, kde jsou problémy s rušením, nebo kdy uživatel je kokot a neví pustit kalibraci offsetu ADC a pak se diví, že má měření ujetý.
21.01.2020 (20:25:25)  # IP X
VroutekB:
PS: Kalibraci ADC za vás nespustí ani CubeMx a ujetá kalibrační hodnota interní reference je známej jev, akorát ne na F0, tuším to byl typickej problém při výrobě L1 - pokud si to s něčím nepletu.
21.01.2020 (23:39:24)  # IP X
milan obalka :
Jo, jsem kokot no... já to vím. proto se raděj zeptám.
V tutoriálech to není a ve škole jsme měli jen ruční měření.
No google mi na slovo kalibrace vyhodil hromadu věcí, tak zítra to omrknu.
22.01.2020 (14:53:19)  # IP X
milan obalka :
Pokud máte blbou náladu a potrřebujete si jí zlepšit, mužete se mi vysmát...
Jeden pitomej řádek, nechápu proč to tam MX nedá defaultně, proč to není součástí tutoriálu na ADC...
Jo, funguje to, sem happy. jo, kdyby někdo hledal, tak je to v manuálu k HAL na straně 100 **01
22.01.2020 (21:07:45)  # IP X
VroutekB:
Vono by stačilo, kdyby lidi nejdřív četli datasheety a související dokumenty, až pak si hráli s všivým HALem.
22.01.2020 (23:08:12)  # IP X
RayeR (web) :
Njn, komu se dnes chce procitat tisic+ strankovy datasheety s hromadou errat... :)

>milan
kdyz uz, tak aspon napis jakej radek - pokud mozno primo co kam do jakeho registru bez pouziti HAL sracky.
23.01.2020 (13:36:51)  # IP X
milan obalka :
Já to spustil normálně HALem. HAL_ADCEx_Calibration_Start(&hadc);
Je to teda pro F0 řadu, z dokumentu UM1785
Na registry nešahám, jednak na to nemám znalosti a druhak mi to vedoucí diplomky nedoporučil, spíš zakázal.
jako jo, na tohle jsem zapomenul, bo k jednomu MCU mi stačilo u AVR jeden datasheet, kde byly dokonce i example kody, tady ale mám už manuál na HW, manuál na čip a manuál na nucleo. A už mi nedojde, že mám vlastně ještě manuál na HAL a další manuál na manuál **01
Ono taky na STM mám projekty tak dva, tři a na AVR desítky.
23.01.2020 (14:40:23)  # IP X
RayeR (web) :
Jj, rozumim. OK, tak se tomu kouknu na streva (mam tu zrovna rozbalenej Cube pro F1xx), naka top level user funkce ADCx_Init() vola:
HAL_ADC_GetState()
nastaveni parametru do struktury
ADCx_MspInit()
HAL_ADC_Init()
HAL_ADCEx_Calibration_Start()

tu mame v stm32f1xx_hal_adc_ex.c

/**
* @brief Perform an ADC automatic self-calibration
* Calibration prerequisite: ADC must be disabled (execute this
* function before HAL_ADC_Start() or after HAL_ADC_Stop() ).
* During calibration process, ADC is enabled. ADC is let enabled at
* the completion of this function.
* @param hadc: ADC handle
* @retval HAL status
*/
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc)
{
HAL_StatusTypeDef tmp_hal_status = HAL_OK;
uint32_t tickstart;
__IO uint32_t wait_loop_index = 0U;

/* Check the parameters */
assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));

/* Process locked */
__HAL_LOCK(hadc);

/* 1. Calibration prerequisite: */
/* - ADC must be disabled for at least two ADC clock cycles in disable */
/* mode before ADC enable */
/* Stop potential conversion on going, on regular and injected groups */
/* Disable ADC peripheral */
tmp_hal_status = ADC_ConversionStop_Disable(hadc);

/* Check if ADC is effectively disabled */
if (tmp_hal_status == HAL_OK)
{
/* Set ADC state */
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
HAL_ADC_STATE_BUSY_INTERNAL);

/* Hardware prerequisite: delay before starting the calibration. */
/* - Computation of CPU clock cycles corresponding to ADC clock cycles. */
/* - Wait for the expected ADC clock cycles delay */
wait_loop_index = ((SystemCoreClock
/ HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_ADC))
* ADC_PRECALIBRATION_DELAY_ADCCLOCKCYCLES );

while(wait_loop_index != 0U)
{
wait_loop_index--;
}

/* 2. Enable the ADC peripheral */
ADC_Enable(hadc);

/* 3. Resets ADC calibration registers */
SET_BIT(hadc->Instance->CR2, ADC_CR2_RSTCAL);

tickstart = HAL_GetTick();

/* Wait for calibration reset completion */
while(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_RSTCAL))
{
if((HAL_GetTick() - tickstart) > ADC_CALIBRATION_TIMEOUT)
{
/* Update ADC state machine to error */
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_BUSY_INTERNAL,
HAL_ADC_STATE_ERROR_INTERNAL);

/* Process unlocked */
__HAL_UNLOCK(hadc);

return HAL_ERROR;
}
}


/* 4. Start ADC calibration */
SET_BIT(hadc->Instance->CR2, ADC_CR2_CAL);

tickstart = HAL_GetTick();

/* Wait for calibration completion */
while(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_CAL))
{
if((HAL_GetTick() - tickstart) > ADC_CALIBRATION_TIMEOUT)
{
/* Update ADC state machine to error */
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_BUSY_INTERNAL,
HAL_ADC_STATE_ERROR_INTERNAL);

/* Process unlocked */
__HAL_UNLOCK(hadc);

return HAL_ERROR;
}
}

/* Set ADC state */
ADC_STATE_CLR_SET(hadc->State,
HAL_ADC_STATE_BUSY_INTERNAL,
HAL_ADC_STATE_READY);
}

/* Process unlocked */
__HAL_UNLOCK(hadc);

/* Return function status */
return tmp_hal_status;
}
23.01.2020 (14:40:39)  # IP X
RayeR (web) :
Takze to nak nastavuje bit ADC_CR2_RSTCAL, pak to ceka dokud je bit nastaveny - reset kalibrace,
Pak to nahodi bit ADC_CR2_CAL a opet ceka dokud je nahozen - kalibrace je dokoncena.
Takze zadna velka veda, jen se to musi delat pri vyplem prevodniku a chvilku pockat. Sem cekal, jesi tam nebude nake mereni nuly, mereni reference a naky vypocet, ale zda se, ze si to HW dela sam...
23.01.2020 (14:45:33)  # IP X
RayeR (web) :
Taky v ty funkci vobcas bejvaj chyby
https://community.st.com/s/question/0D50X00009kLCgU/bug...
ale to se tykalo zrovna H7
Přezdívka:
Heslo:
Text: