【stm32】ADC的規則通道和注入通道混合使用


    之前完成了規則通道DMA的數據傳輸了,不過平時在使用ADC的時候可能就會遇到很多情況,不可能就這樣簡單的按規則通道來采樣,DMA存儲,使用數據的;可能有時候會需要立刻采樣,那樣我們就需要利用到注入通道了。文檔關於注入通道的解釋:

1      利用外部觸發或通過設置ADC_CR2寄存器的ADON位,啟動一組規則通道的轉換。 
2      如果在規則通道轉換期間產生一外部注入觸發,當前轉換被復位,注入通道序列被以單次掃描方式進行轉換。 
3      然后,恢復上次被中斷的規則組通道轉換。如果在注入轉換期間產生一規則事件,注入轉換不會被中斷,但是規則序列將在注入序列結束后被執行。
  將變阻器的那路ADC設置為注入通道:
1  ADC_InjectedSequencerLengthConfig(ADC1, 1);\\設置注入通道長度
2  ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);\\配置注入通道
3  ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);\\開始注入通道數據采樣和轉換
   開始之后,延遲足夠的時間,讓ADC采樣和轉換完成。
     用ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);讀取注入通道1的數據,結果發現數據一直不變,那肯定是哪里設置出錯了,找了下別人的設置,並做了一些嘗試,發現了原來是設置的問題,注入采樣的觸發方式沒有設置:
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
     這個函數設置注入方式使用軟件觸發方式,設置完之后用開始采樣和讀取數據函數,就能采到正確的數據。
 
     上面的例子使用觸發注入完成的,下面又嘗試了自動注入。這樣每次進行規則通道采樣時,也會順便把注入通道也進行采樣了,而啟動注入通道采樣則不會對規則通道進行采樣。
如果設置了 JAUTO 位,在規則組通道之后,注入組通道被自動轉換。這可以用來轉換在 ADC_SQRx 和 ADC_JSQR 寄存器中設置的多至 20 個轉換序列。
     
     還有在規則通道使用DMA數據傳輸,且使用注入通道采樣時,不知道會不會對數據有影響?
    查了下文檔,只有在規則通道的轉換結束時才產生 DMA 請求,並將轉換的數據從 ADC_DR 寄存器傳輸到用戶指定的目的地址,還有注入方式轉換后數據存儲到 ADC_DRJx寄存器和規則方式轉換后數據存儲在ADC_DR寄存器中。
  在注入通道和規則通道的混合使用中,我花了不少時間去找正確的設置,問題是不知道哪些庫函數是必要的,哪些是非必要的,后來對着例子嘗試之后才知道。后面我還想了解下具體的寄存器設置,看了幾個初始化的函數,發現其實很多設置都是對ADC_CR1的設置,有不少不明白的看了寄存器就知道了,看來函數的使用還是要和寄存器對應的位結合起來,這樣才能理解的透徹點。
  下面是我整個代碼的設置,其他設置和上篇例子一樣,只改了ADC設置:
  
 1 static void Protect_AdcInit(void)
 2 {
 3     ADC_InitTypeDef ADC_InitStructure;
 4     
 5     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
 6     ADC_InitStructure.ADC_ScanConvMode = ENABLE;
 7     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
 8     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//軟件觸發
 9     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
10     ADC_InitStructure.ADC_NbrOfChannel = 2;//規則通道的數量
11     ADC_Init(ADC1, &ADC_InitStructure);//這個大部分是初始化規則通道的
12     
13     ADC_TempSensorVrefintCmd(ENABLE);
14     ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,1,ADC_SampleTime_239Cycles5);
15     ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,2,ADC_SampleTime_239Cycles5);
16     
17     ADC_InjectedSequencerLengthConfig(ADC1, 1);
18      ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);
19     ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);//設置規則通道軟件觸發
20     /* Enable automatic injected conversion start after regular one */
21   //  ADC_AutoInjectedConvCmd(ADC1, ENABLE);
22 
23     
24     ADC_DMACmd(ADC1, ENABLE);
25     /* Enable ADC1 external trigger */
26     ADC_ExternalTrigConvCmd(ADC1, DISABLE);
27     ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE);
28 
29     ADC_Cmd(ADC1, ENABLE);
30 
31     ADC_ResetCalibration(ADC1);
32 
33     while(ADC_GetResetCalibrationStatus(ADC1));
34 
35     ADC_StartCalibration(ADC1);
36 
37     while(ADC_GetCalibrationStatus(ADC1));
38 
39 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM