stm32c8t6僅有12位分辨率
1、單次轉換 非掃描
1、初始化
void Ad_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//配置ADCCLK時鐘分頻,ADC的輸入時鐘不得超過14MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);GPIO_InitTypeDef GPIO_InitStructure;//初始化為模擬輸入引腳GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//選擇規則組輸入通道ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);ADC_InitTypeDef ADC_InitStruct;//獨立模式 ADC1 和 ADC2 單獨轉換ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//選擇數據對齊 左對齊、右對齊ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//外部觸發源選擇, 這里使用軟件觸發,所以選擇NoneADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//連續轉換模式, 選擇單次轉換還是連續轉換ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//掃描轉換模式, 選擇掃描模式還是非掃描模式ADC_InitStruct.ADC_ScanConvMode=DISABLE;//通道數目, 只有在掃描模式下才能使用多個通道ADC_InitStruct.ADC_NbrOfChannel=1;ADC_Init(ADC1, &ADC_InitStruct);ADC_Cmd(ADC1, ENABLE);//手冊中建議在每次上電后執行一次校準//復位校準ADC_ResetCalibration(ADC1);//等待復位校準完成, 復位校準完成后為 RESETwhile(ADC_GetResetCalibrationStatus(ADC1)==SET);//開始校準ADC_StartCalibration(ADC1);//等待校準完成while(ADC_GetCalibrationStatus(ADC1)==SET);}
ADC的復位校準位
2、開始轉換
uint16_t AD_GetValue()
{//開始轉換ADC_SoftwareStartConvCmd(ADC1, ENABLE);//判斷轉換是否完成, 轉換結束時EOC置1while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);//取轉換結果, 內部代碼為讀取DR寄存器內容,//讀取后會自動清除EOC標志位return ADC_GetConversionValue(ADC1);
}
2、連續轉換 非掃描
????????
不需要不斷地觸發,不需要等待轉換完成
ADC會連續不斷地對指定通道進行轉換,把結果放到數據寄存器中
1、初始化
ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;//手冊中建議在每次上電后執行一次校準
//復位校準
ADC_ResetCalibration(ADC1);
//等待復位校準完成, 復位校準完成后為 RESET
while(ADC_GetResetCalibrationStatus(ADC1)==SET);
//開始校準
ADC_StartCalibration(ADC1);
//等待校準完成
while(ADC_GetCalibrationStatus(ADC1)==SET);
//連續轉換僅需要在最開始觸發一次就可以,
//軟件觸發轉換函數可以挪到初始化最后,不需要每次取值都使用
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
2、返回值
連續轉換模式下,不需要判斷轉換完成的標志位,直接返回值就可以
uint16_t AD_GetValue()
{return ADC_GetConversionValue(ADC1);
}