STM32AD转换
1、stm32F103C8T6AD资源介绍
stm32F103C8T6有两个ADC资源,12位逐次逼近型ADC,输入电压范围0~3.3V,转换范围0到4095(2^12-1),两者线性相关。最大转换时间1us,即最大频率为1MHZ。18个转换通道,可测量16个外部和两个内部信号源,但引出引脚只能测10个外部信号源。有规则组和注入组两个转换单元,有单次、连续转换模式,非扫描、扫描模式。
ADC转换基本框图
1.规则组
规则组可以一次性转换16个AD数据,但规则组数据通道寄存器只能存放一个数据,如果要实现一次性转换,且保证数据不丢失,一般需要配合DMA来使用。
2.注入组
注入组可以一次性转换4个AD数据,且注入组数据通道寄存器可以存放四个数据。
2、AD转换具体代码实现(基于标准库软件触发)
1、配置时钟和GPIO口
ADC共有10个输入通道,ADC1和ADC2都复用在每一个通道上,即每个通道可以选择不同的ADC资源。每个通道有对应的IO口,这里选用PA0,选择ADC1_IN0。
ADCCLOCK最大频率为14MHZ。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //6分频,72/6=12MHZ
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);
2、规则组通道配置
把通道0放在第一个序列,采样时间55.5个ADC周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1, ADC_SampleTime_55Cycles5);
3、ADC结构体配置以及校准
单次转换模式每次采集都要重新软件触发一次,连续转换模式只要软件触发一次就行且不需要判断EOC标志位。
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; // 单次转换模式
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //右对齐数据
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //不外部触发,软件触发
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //独立工作模式
ADC_InitStructure.ADC_NbrOfChannel=1; //通道数目
ADC_InitStructure.ADC_ScanConvMode=DISABLE; // 非扫描模式
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE); //使能ADC
ADC_ResetCalibration(ADC1); //复位校准
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1); //开始校准
while (ADC_GetCalibrationStatus(ADC1) == SET);
4、ADC数据采集
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始转换
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //判断转换是否完成,即判断EOC标志位是否置1
ADC_GetConversionValue(ADC1); //数据采集函数