1.前言
書接上回,在看手冊的時候我突然發現手冊上還描述了另一種ADC掃描模式,即非連續掃描模式,想著連續掃描模式都已經探索過了,那就順手把非非連續模式研究一下吧。
2.理論
我們先看看手冊,這里我就以規則通道舉例了
首先,我們先了解一下什么是非連續模式,這里的非連續模式指的是不在同一個周期內將所有管腳的電壓全部讀取完畢。手冊上也給出了例子,也是比較好理解的。
然后我們再看看需要置為的寄存器,是CR1里的DISCEN和DISCNUM幾位,我們看到CR1里
分別是11位,13~15位
3.程序
我先把程序放出來,這里我用的通道0、3、4、5四個通道,每次采樣2個通道。
void init_adc1(unsigned char ch1,unsigned char adcm)
{init_adc12_chinal(0); //初始化通道0init_adc12_chinal(3); //初始化通道3init_adc12_chinal(4); //初始化通道4init_adc12_chinal(5); //初始化通道5ADC1->CR1&=~(3<<24); //15 ADCCLK 周期ADC1->CR1|=(1<<8); //掃描模式ADC1->CR1|=1<<11; //ADC1非連續掃描模式ADC1->CR1|=1<<13; //不連續采樣通道數為2ADC1->CR2&=~(1<<1); //單次轉換ADC1->CR2&=~(1<<11); //數據右對齊ADC1->CR2&=~(3<<28); //禁止觸發檢測ADC1->SQR1&=~(0XF<<20); //重置規則通道序重置列長度ADC1->SQR1|=3<<20; //4個轉換在規則序列中//設置通道0的采樣時間ADC1->SMPR2&=~(7<<(3*0)); //通道0 采樣時間清空 ADC1->SMPR2|=(7<<(3*0)); //通道0 480個周期,提高采樣時間可以提高精確度//設置通道3的采樣時間ADC1->SMPR2&=~(7<<(3*3)); //通道3 采樣時間清空 ADC1->SMPR2|=(7<<(3*3)); //通道3 480個周期,提高采樣時間可以提高精確度//設置通道4的采樣時間ADC1->SMPR2&=~(7<<(3*4)); //通道4 采樣時間清空 ADC1->SMPR2|=(7<<(3*4)); //通道4 480個周期,提高采樣時間可以提高精確度//設置通道5的采樣時間ADC1->SMPR2&=~(7<<(3*5)); //通道5 采樣時間清空 ADC1->SMPR2|=(7<<(3*5)); //通道5 480個周期,提高采樣時間可以提高精確度ADC1->SQR3=0; //重置規則通道轉換配置ADC1->SQR3|=0<<0; //設置第一次規則轉換通道0ADC1->SQR3|=3<<5; //設置第二次規則轉換通道3ADC1->SQR3|=4<<10; //設置第三次規則轉換通道4ADC1->SQR3|=5<<15; //設置第四次規則轉換通道5ADC1->CR2|=1<<8; //使能DMA模式ADC1->CR2|=1<<0; //開啟AD轉換器
}
因此我們把CR1的11位置1開啟非連續掃描模式,11~15位寫2,表示單次采集2個通道。
同時我們的轉換通道數要配置成4
然后是轉換順序,因為我們需要多次手動觸發,因此在初始化階段將轉換順序配置好即可
然后是軟件觸發的程序
void adc1_incontinue_scanf()
{ADC1->CR2|=1<<30; //開始轉換
}
因為單個循環轉換完畢后沒有事件生成,因此我們這里不做判斷。理論上來說我們的轉換時間也應該不是連續的,否則就用連續模式了。
4.測試
首先是主程序,按照DMA-ADC初始化順序即可,這里我在兩次掃描間加入10ms的延遲防止干擾。
int main(void)
{ Stm32_Clock_Init(336,25,2,7);//設置時鐘,168MhzNVIC_SetGroup(1);//設置中斷分組,分組1init_PinClock();//初始化所有時鐘delay_init(168);//初始化延時init_DMAClock();//初始化DMA時鐘init_DMA2_S0C0(4); //DMA2 ADC1轉換init_AllAdc();//初始化所有ADC時鐘init_adc1(0,2);//初始化ADC1adc1_incontinue_scanf();//第一次掃描delay_ms(10);adc1_incontinue_scanf();//第二次掃描}
首先我們先測試是否是兩次轉換
程序停在兩次延遲處,四個數據中前兩位正常有數據了
兩次觸發完畢后四位數據正常了。
然后測試通道是否正常,有沒有發生串擾
首先把PA4接地
第三個數據確實是0
然后我們再把PA3接地
OK,也沒問題,第二個數據也是0了
5.結語
非連續掃描模式也不算難,可以說掃描模式順帶功能吧。那么OK,還是老樣子,有問題評論區見,下篇文章我將介紹407多重ADC的使用方法。