先看一下,大家認(rèn)為“正確”的代碼
void MYADC_init(void) {
//時鐘使能
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//GPIO配置
GPIO_InitTypeDef PORT_ADC;
PORT_ADC.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
PORT_ADC.GPIO_Mode = GPIO_Mode_AN;
PORT_ADC.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &PORT_ADC);
//ADC配置
ADC_InitTypeDef ADC_InitStuctrue;
ADC_InitStuctrue.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStuctrue.ADC_ContinuousConvMode = DISABLE;
ADC_InitStuctrue.ADC_ExternalTrigConv= ADC_ExternalTrigConvEdge_None;
ADC_InitStuctrue.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStuctrue.ADC_ScanDirection = ADC_ScanDirection_Backward;
ADC_Init(ADC1, &ADC_InitStuctrue);
//ADC使能
ADC_Cmd(ADC1, ENABLE);
}
unsigned short MYADC_getValue(unsigned char arg0) {
if(arg0==1){
ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_239_5Cycles);
}else if(arg0==2){
ADC_ChannelConfig(ADC1, ADC_Channel_2, ADC_SampleTime_239_5Cycles);
}else if(arg0==3){
ADC_ChannelConfig(ADC1, ADC_Channel_3, ADC_SampleTime_239_5Cycles);
}
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY) == RESET);
ADC_StartOfConversion(ADC1);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
int main(void){
//此處完成你的各種初始化
MYADC_init();
unsigned short adcValue1;
unsigned short adcValue2;
unsigned short adcValue3;
while(1){
adcValue1=MYADC_getValue(1);
//此處加入程序,如將adcValue打印發(fā)送出來
adcValue2=MYADC_getValue(2);
//此處加入程序,如將adcValue打印發(fā)送出來
adcValue3=MYADC_getValue(3);
//此處加入程序,如將adcValue打印發(fā)送出來
}
}
以上代碼,是我之前認(rèn)為“正確”的代碼,但是當(dāng)執(zhí)行while時,一開始打印出來的3個值adcValue1,adcValue2和adcValue3都是正確的,但是后面繼續(xù)打印的數(shù)據(jù)都是同adcValue3。
那是什么原因造成的嗎?
原來,問題出在ADC_ChannelConfig()函數(shù)。
大家可以在STM32庫源文件中找到如下圖所示代碼。
問題在于,庫函數(shù)中對ADC通道選擇寄存器的賦值用的是或“|”,當(dāng)while(1)第一次執(zhí)行該函數(shù)時,ADC_Channel=0x00000001,CHSELR=0x00000001,ADC轉(zhuǎn)換數(shù)據(jù)對應(yīng)第一通道,第二次執(zhí)行該函數(shù)的時候,ADC_Channel=0x00000010,CHSELR=0x00000011,因為是獨立采樣模式,系統(tǒng)對高位有效通道進(jìn)行采樣,對應(yīng)結(jié)果為第2通道的值。第三次執(zhí)行該函數(shù)時,ADC_Channel=0x0000100,CHSELR=0x00000111,同樣,因為是獨立采樣模式,對應(yīng)結(jié)果為第3通道的值。在while再次循環(huán)時,我們預(yù)期結(jié)果希望是第一通道,但是實際上此時的CHSELR值已經(jīng)是0x00000111了,在和0x00000001相或,值還是0x00000111,所以實際結(jié)果是最高位,即第3通道的值。
針對多通道單獨采樣模式,個人建議直接對CHSELR寄存器進(jìn)行賦值,使用方法如下:
unsigned short MYADC_getValue(unsigned char arg0) {
if(arg0==1){
ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_239_5Cycles);
ADC1->CHSELR =ADC_Channel_1;
}else if(arg0==2){
ADC_ChannelConfig(ADC1, ADC_Channel_2, ADC_SampleTime_239_5Cycles);
ADC1->CHSELR =ADC_Channel_2;
}else if(arg0==3){
ADC_ChannelConfig(ADC1, ADC_Channel_3, ADC_SampleTime_239_5Cycles);
ADC1->CHSELR =ADC_Channel_3;
}
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY) == RESET);
ADC_StartOfConversion(ADC1);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
上一篇:stm32f030c8t6 MCU進(jìn)入低功耗模式
下一篇:STM32F030C8T6 STM32F030R8T6 STM32F030 STOP低功耗模式配置
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 地平線陳黎明:中高階智能駕駛拐點已到,將迎來快速增長
- 格芯收購MIPS:RISC-V技術(shù)路線的新變量
- 消息稱蜂巢能源獲smart電池項目定點
- 極氪9X有哪些豪華混動技術(shù)?
- 重磅!電動汽車換電新國標(biāo)發(fā)布!
- 緊跟全球行業(yè)變革浪潮 采埃孚引領(lǐng)汽車底盤技術(shù)革新
- 英特爾前 CEO 帕特?基辛格再創(chuàng)業(yè):評估 AI 模型是否符合特定的人類價值觀
- 汽車動力傳動機(jī)引擎及機(jī)械/實體參數(shù)測試
- 車云一體數(shù)據(jù)閉環(huán)的趨勢
- 車云一體其他層面的架構(gòu)設(shè)計借鑒-上
- 【搶樓】正式開始!來搶TI LM3S811評估板吧!!!
- LYTSwitch-1 LED驅(qū)動器 天生小體積,應(yīng)用高效率,圍觀有好禮!
- 【搶樓有禮】聊聊vishay照明應(yīng)用在我們身邊哪些地方!
- TI MCU 常見問題(FAQ)大搜集
- 你有原創(chuàng),我有豪禮!(原創(chuàng)精選評選第7期)
- 與未來同行-是德科技創(chuàng)新技術(shù)峰會·北京
- 更好的你我,更好的EEWorld!2020年終慶典
- 下載MPS汽車電機(jī)控制技術(shù)干貨,贏【Keep體脂秤、自動洗手機(jī)套裝、小米保溫杯】,開啟汽車技術(shù)進(jìn)階之旅!
- 【已結(jié)束】PI 直播【適合工業(yè)市場輔助電源的碳化硅和氮化鎵 IC】(9:30入場)
- BeagleBone Black 開發(fā)板 DIY 創(chuàng)意設(shè)計大賽