本文主要是介绍STM32学习过程记录6——内部定时器+ADC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第六课,定时器中断(内部定时器的使用)
目录
第六课,定时器中断(内部定时器的使用)
一.ADC的初始化
1.ADC的初始化
2.ADC的读取代码
二.快捷模板
ADC的初始化:
ADC读取模板1:(单次)
ADC读取模板2:(平均)
一.ADC的初始化
1.ADC的初始化
过程:
①开启端口时钟和ADC时钟,设置端口为模拟输入。
② 复位ADC,同时设置ADC分频因子(必须<14MHz)。
③ 初始化ADC参数,设置ADC的工作模式以及规则序列的相关信息。
④ 使能ADC并校准。
代码:
①开启端口时钟和ADC时钟,设置端口为模拟输入。
GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );//使能ADC1通道时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//引脚选择
GPIO_Init(GPIOA, &GPIO_InitStructure);
② 复位ADC,同时设置ADC分频因子(必须<14MHz)。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
③ 初始化ADC参数,设置ADC的工作模式以及规则序列的相关信息。
ADC_InitTypeDef ADC_InitStructure;ADC_DeInit(ADC1);//复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
④ 使能ADC并校准。
ADC_Cmd(ADC1, ENABLE);//使能指定的ADC1ADC_ResetCalibration(ADC1);//使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束//ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能,这段代码视频没有
2.ADC的读取代码
过程:
⑤ 配置规则通道参数。
⑥开启软件转换。
⑦等待转换完成,读取ADC值。
代码:
⑤ 配置规则通道参数。
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );//ADC1,ADC通道,采样时间为239.5周期
⑥开启软件转换。
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能
⑦等待转换完成,读取ADC值。
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
二.快捷模板
ADC的初始化:
void Adc_Init(void)
{ ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));
}
ADC读取模板1:(单次)
u16 Get_Adc(u8 ch)
{ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
ADC读取模板2:(平均)
u16 Get_Adc_Average(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);delay_ms(5);}return temp_val/times;
}
这篇关于STM32学习过程记录6——内部定时器+ADC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!