STM32CubeIDE - obsluha vice kanalu ADC

Pavel Kutina hw na prelude.cz
Pondělí Listopad 1 18:27:45 CET 2021


No to jsem si taky myslel, resp. vyčetl z nějakých popisů - akorát mi to 
nechodí. Vypadá to, že mám bordel v té inicializaci, Cube toho tam namastí 
jenom část a právě init sekvence pro další kanály tam chybí. A otázkou je, 
jestli já ten zbytek dopisuju správně...

Mimochodem - zkusil jsem znovu spustit ten konfigurátor a ejhle, na ADC1 mi 
nejde povolit Scan Coversion Mode - v menu je jen varianta Disabled, 
varianta Enabled není ani šedá, prostě jen jedna položka v klikátoru. Takže 
teď nevím, jestli je to tím, že prostě Enabled být nemůže a já musím hledat 
proč a co s tím udělat, nebo tam být může (a podle mého má) a já ji mám jen 
blbě povolenou (v init kódu jsem ji enabloval).

A to jsem si myslel, že už jsem šedivej dostatečně...

Pavel Kutina


----- Original Message ----- 
From: Marek Sembol
To: HW-news
Sent: Monday, November 1, 2021 5:34 PM
Subject: Re: STM32CubeIDE - obsluha vice kanalu ADC


BEZ ZARUKY: muslim, ze to funguje tak, ze po Start musite dat postupne 
(tolik krat kolik mate tech kanalu) Pool a GetValue. Ony budou vracet 
postupne z jednotlivych kanalu.
BR,
Marek


On Mon, Nov 1, 2021 at 4:51 PM Fanda Kopriva <info na elektronikavyvoj.cz> 
wrote:

dobry den
nevim jestli Vam to pomuze ,ale tady mam treba obsluhu ADC ze starsiho
projektu s stm32l162
nastavi se az 4 kanaly pro konverze ADC_JSQR =
a vysledky jsou v ADC_JDR1 - 4

  void ADCfce (void)
    {
     unsigned int timout;
           ADerror = 0;
           RCC_APB2ENR |= 0x200;       //ad
           RCC_CR |= 0x1;
           timout = 0;
           while (!((RCC_CR & 0x2) || (timout>1000))){timout++;};
           if (timout>1000) ADerror |= 1;
           ADC_CCR = 0x820000;        //hsi/4
           ADC_CR2 &= ~0x1;    //   zakaz adc
           ADC_CR1  =  0x30100;//     scan
           ADC_JSQR = 0x381508;            // 3kanaly temp16 5vin 8vin
8vin1  10000 00101 01000 01000
           ADC_SMPR2 = 0x100000;
           ADC_CR2 |=  0x1;    //   zapni adc
           while (!(((ADC_SR & 0x240) == 0x40 ) ||
(timout>1000))){timout++;};
           if (timout>1000) ADerror |= 4;
           timout = 0;
           ADC_CR2 |= 0x400000;   //start converze inject vysledek v
ADC_JDR3 2 1
           while (!((ADC_SR & 0x4) || (timout>1000))){timout++;};
           if (timout>1000) ADerror |= 2;
           vpom = ADC_JDR4; vpom = ((vpom * 50) / 141) - 173 ;
           vtep = vpom ;    //
           vpom = ADC_JDR3; battest=vpom;vpom = (vpom * 424) / 234;
//191mV = 234     U = (4.24 / 234) * x
           vbat = vpom  ;  //2680 324 > 420
           vpom = ADC_JDR2; vintest=vpom;vpom = (vpom * 237) >> 8;
//vpom = (vpom * 22) / 25;     //*92/100 925/1000    947/1024
           vin = vpom ;   //660 362 > 500
480 na 4.8V   >> 1000 na 10V
           vpom = ADC_JDR1; vpom = (vpom * 22) / 25;
           vin1 = vpom ;   //660 362 > 500
}

fanda


Dne 01.11.2021 v 15:57 Pavel Kutina napsal(a):
> Zdravím,
>
> tak pořád nějak válčím s Cube a teď jsem se zaseknul zase trochu
> hlouběji:
>
> Potřebuji měři na čtyřech kanálech ADC.
> V klikátoru je mám nastavené na ADC1 (je to STM32L471VGT) jako
> ADC1_IN1 na PC0 až ADC1_4 na PC4.
>
> Rád bych vyčítal každý kanál "ručně", zatím nechci DMA, snažím se to
> rozbíhat po kouskách a vzhledem k mým (ne)vědomostem začátečníka to
> chci řešit postupně. Ale jak to nakonfigurovat?
>
> V předgenerovaném kódu mám teď tohle, ale jak na jednotlivé kanály
> přistupovat, resp. jak z nich číst? V DMA režimu to snad napadá do
> pole, do kterého to vyčítám, ale bez DMA? Zjevně mi někde něco uniká,
> googlováním jsem strávil podstatnou část odpoledne, buď nevím, co
> hledám, nebo to bez DMA nejde?
>
> V hlavní smyčce mám teď jenom tohle, ale rád bych nějaké hodnoty i do
> ADCval2 ... 4
>
> Díky za každé nasměrování.
>
> Pavel Kutina
>
>
>
> //------------------------------------------------------------------
>  HAL_ADC_Start(&hadc1);
>  HAL_ADC_PollForConversion(&hadc1, 0xFFFFFFFF);
>
>  ADCval1 = HAL_ADC_GetValue(&hadc1);
>  ADCval2 = ?
>
>
>  V inicializaci:
> //------------------------------------------------------------------
>
>  /** Configure Regular Channel
>  */
>  sConfig.Channel = ADC_CHANNEL_1;
>  sConfig.Rank = ADC_REGULAR_RANK_1;
>  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
>  sConfig.SingleDiff = ADC_SINGLE_ENDED;
>  sConfig.OffsetNumber = ADC_OFFSET_NONE;
>  sConfig.Offset = 0;
>  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
>  {
>    Error_Handler();
>  }
>
>  sConfig.Channel = ADC_CHANNEL_2;
>  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
>  {
>    Error_Handler();
>  }
>
>  sConfig.Channel = ADC_CHANNEL_3;
>  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
>  {
>    Error_Handler();
>  }
>
>  sConfig.Channel = ADC_CHANNEL_4;
>  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
>  {
>    Error_Handler();
>  }
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list




_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list 



Další informace o konferenci Hw-list