<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > stm32 ADC的規則通道和注入通道混合使用

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

作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò ) 收藏
之前完成了規則通道DMA的數據傳輸了,不過(guò)平時(shí)在使用ADC的時(shí)候可能就會(huì )遇到很多情況,不可能就這樣簡(jiǎn)單的按規則通道來(lái)采樣,DMA存儲,使用數據的;可能有時(shí)候會(huì )需要立刻采樣,那樣我們就需要利用到注入通道了。文檔關(guān)于注入通道的解釋:
1      利用外部觸發(fā)或通過(guò)設置ADC_CR2寄存器的ADON位,啟動(dòng)一組規則通道的轉換。 2      如果在規則通道轉換期間產(chǎn)生一外部注入觸發(fā),當前轉換被復位,注入通道序列被以單次掃描方式進(jìn)行轉換。 3      然后,恢復上次被中斷的規則組通道轉換。如果在注入轉換期間產(chǎn)生一規則事件,注入轉換不會(huì )被中斷,但是規則序列將在注入序列結束后被執行。
  將變阻器的那路ADC設置為注入通道:
1  ADC_InjectedSequencerLengthConfig(ADC1, 1);\設置注入通道長(cháng)度2  ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);\配置注入通道3  ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);\開(kāi)始注入通道數據采樣和轉換
  開(kāi)始之后,延遲足夠的時(shí)間,讓ADC采樣和轉換完成。
用ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);讀取注入通道1的數據,結果發(fā)現數據一直不變,那肯定是哪里設置出錯了,找了下別人的設置,并做了一些嘗試,發(fā)現了原來(lái)是設置的問(wèn)題,注入采樣的觸發(fā)方式?jīng)]有設置:
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
這個(gè)函數設置注入方式使用軟件觸發(fā)方式,設置完之后用開(kāi)始采樣和讀取數據函數,就能采到正確的數據。
上面的例子使用觸發(fā)注入完成的,下面又嘗試了自動(dòng)注入。這樣每次進(jìn)行規則通道采樣時(shí),也會(huì )順便把注入通道也進(jìn)行采樣了,而啟動(dòng)注入通道采樣則不會(huì )對規則通道進(jìn)行采樣。
如果設置了 JAUTO 位,在規則組通道之后,注入組通道被自動(dòng)轉換。這可以用來(lái)轉換在 ADC_SQRx 和 ADC_JSQR 寄存器中設置的多至 20 個(gè)轉換序列。
還有在規則通道使用DMA數據傳輸,且使用注入通道采樣時(shí),不知道會(huì )不會(huì )對數據有影響?
查了下文檔,只有在規則通道的轉換結束時(shí)才產(chǎn)生 DMA 請求,并將轉換的數據從 ADC_DR 寄存器傳輸到用戶(hù)指定的目的地址,還有注入方式轉換后數據存儲到 ADC_DRJx寄存器和規則方式轉換后數據存儲在A(yíng)DC_DR寄存器中。
  在注入通道和規則通道的混合使用中,我花了不少時(shí)間去找正確的設置,問(wèn)題是不知道哪些庫函數是必要的,哪些是非必要的,后來(lái)對著(zhù)例子嘗試之后才知道。后面我還想了解下具體的寄存器設置,看了幾個(gè)初始化的函數,發(fā)現其實(shí)很多設置都是對ADC_CR1的設置,有不少不明白的看了寄存器就知道了,看來(lái)函數的使用還是要和寄存器對應的位結合起來(lái),這樣才能理解的透徹點(diǎn)。
  下面是我整個(gè)代碼的設置,其他設置和上篇例子一樣,只改了ADC設置:

本文引用地址:http://dyxdggzs.com/article/201611/317106.htm
[cpp]view plaincopy
  1. staticvoidProtect_AdcInit(void)
  2. {
  3. ADC_InitTypeDefADC_InitStructure;
  4. ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
  5. ADC_InitStructure.ADC_ScanConvMode=ENABLE;
  6. ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
  7. ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//軟件觸發(fā)
  8. ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
  9. ADC_InitStructure.ADC_NbrOfChannel=2;//規則通道的數量
  10. ADC_Init(ADC1,&ADC_InitStructure);//這個(gè)大部分是初始化規則通道的
  11. ADC_TempSensorVrefintCmd(ENABLE);
  12. ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,1,ADC_SampleTime_239Cycles5);
  13. ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,2,ADC_SampleTime_239Cycles5);
  14. ADC_InjectedSequencerLengthConfig(ADC1,1);
  15. ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);
  16. ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None);//設置規則通道軟件觸發(fā)
  17. /*Enableautomaticinjectedconversionstartafterregularone*/
  18. //ADC_AutoInjectedConvCmd(ADC1,ENABLE);
  19. ADC_DMACmd(ADC1,ENABLE);
  20. /*EnableADC1externaltrigger*/
  21. ADC_ExternalTrigConvCmd(ADC1,DISABLE);
  22. ADC_ExternalTrigInjectedConvCmd(ADC1,DISABLE);
  23. ADC_Cmd(ADC1,ENABLE);
  24. ADC_ResetCalibration(ADC1);
  25. while(ADC_GetResetCalibrationStatus(ADC1));
  26. ADC_StartCalibration(ADC1);
  27. while(ADC_GetCalibrationStatus(ADC1));
  28. }

======================沒(méi)完,繼續=================

讀取數據在這里:

/* 注入轉換中斷 */
void ADC1_2_IRQHandler(void)
{
s32 inj_v1,inj_v2,inj_v3,inj_v4;


if(ADC_GetITStatus(ADC1,ADC_IT_JEOC) == SET){
ADC_ClearITPendingBit(ADC1,ADC_IT_JEOC);
inj_v1 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
inj_v1 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_4);
inj_v1 >>= 1;


inj_v2 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
inj_v2 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_3);
inj_v2 >>= 1;


inj_v3 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_3);
inj_v3 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_2);
inj_v3 >>= 1;


inj_v4 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_4);
inj_v4 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_1);
inj_v4 >>= 1;
}
}


/* 規則轉換中斷 */
void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC1) == SET){
DMA_ClearFlag(DMA1_FLAG_TC1);
DMA_ClearITPendingBit(DMA1_IT_GL1);
ADC_SoftwareStartConvCmd(ADC1,DISABLE);
DMA_Cmd(DMA1_Channel1,DISABLE);


/* ¼ÆËãת»»Öµ */
regular_convert_calc();


/* Æô¶¯ÏÂÒ»´Î´«Êä */
DMA1_Channel1->CNDTR = NUM_OF_REG_CHANNEL;
DMA_Cmd(DMA1_Channel1,ENABLE);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
}

還有這篇說(shuō)的也不錯:用TIM1產(chǎn)生6路ADC,用CCR4觸發(fā)ADC1的注入通道采樣



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>