ADC(簡易的DMA傳輸)的認識
首先看到是ADC的特性
1、ADC的12位分辨率。不能直接測量負電壓,然后是最小量程化單位是LSB=Vref+/212
2、單次和轉換模式的使用
3、 從通道0到通道n的連續掃描模式00
4、自校准。
5、數據的內部自對齊。
6、觸發方式。(根據功能描敘圖。)
如下圖所示
看到這張圖可以看到ADC的工作方式
可以看到所有的器件都是圍繞着模數轉換部分(ADC模塊)展開的。可以看到左邊的有些參考電壓,而有2.4<=Vref+<=3.6
而下面的GPIO端口和溫度傳感器就是ADC的輸入。這些輸入到ADC模塊需要有觸發才能進行工作,所以請看下面就是有的就是定時器觸發,GPIO(A~G)_EXIT_11和GPIO(A~G)_EXIT_15都是外部觸發,也可以使用軟件觸發,今天我們就使用規則通道的軟件觸發實現循環掃描。
當轉換數據完成后進入到規則通道數據寄存器,而寄存器是有32位和16位的,所有這個寄存器是選擇16位的,這時就會讓選擇對齊當時,有左對齊和右對齊。
當然還有就是配置看門狗,當采集的電壓值大於閥值,觸發看門狗中斷。
下面看下具體的實現規則通道的循環掃描通過串口發送到超級終端上。
首先就是配置ADC-GPIO
static void ADC1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
/* Configure PC.01 as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure); // PC1,輸入時不用設置速率。
}
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //獨立ADC模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //禁止掃描通道模式,適用於多通道模式。
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //啟動連續掃描模式。
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部觸發方式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //使用右對齊方式存放。
ADC_InitStructure.ADC_NbrOfChannel = 1; //要轉換的通道數目
ADC_Init(ADC1, &ADC_InitStructure);
/*8分頻,即9MHz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
/*規則通道的配置ADC1的通道1,采樣周期為55.5個周期,序列號為1 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*復位校准寄存器*/
ADC_ResetCalibration(ADC1);
/*等待復位校准寄存器完成工作 */
while(ADC_GetResetCalibrationStatus(ADC1));
/* ADC校准寄存器*/
ADC_StartCalibration(ADC1);
/* 等待完成工作*/
while(ADC_GetCalibrationStatus(ADC1));
/* 啟動軟件觸發ADC轉化*/
ADC_SoftwareStartConvCmd(ADC1, ENABLE);