ADC

发布时间 2023-08-27 11:29:10作者: 磕伴

ADC0809

先选择通道,然后通道输入模拟量电压到比较器的一端,DAC通过改变的SAR编码从而用加权电阻网络生成不同的电压,在比较器的另一端,两者对比相同的时候即得到对应的SAR数字量(对比方法:二分法),然后输出给8位锁存缓冲器

Vref+  和- 是参考电压,对应数字量对应的是3.3V还是5V由这个决定

128  64  32 。。。 每一位都是二进制的位权,判断过程就等于对二进制从高位到低位判断是0还是1的过程  (逐次逼近)

 单通道单次转换

void AD_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 分频72/6=12M  这里最大是14M
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //ADC模拟输入
    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_55Cycles5); 
    // ADC1,指定通道,1(规则组的16个序列的1),_55  数值越小越快,越大越稳定
    
    ADC_InitTypeDef ADC_InitStructure;  
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //工作模式选择  独立还是双ADC模式
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐,
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发源选择EXTI_11_15   ,这里使用内部软件触发
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;// 连续转换模式 
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描转换模式   (对应4种模式)
    ADC_InitStructure.ADC_NbrOfChannel = 1;// 通道数目  (一般用在扫描模式下,非扫描的话只有第一个序列有效)
    ADC_Init(ADC1, &ADC_InitStructure);
    
    ADC_Cmd(ADC1, ENABLE);
    //中断和模拟看门狗  TODU
    ADC_ResetCalibration(ADC1);  //对ADC进行校准   ADC_CR2 位3 先有软件置1,校准后硬件自动置0
    while (ADC_GetResetCalibrationStatus(ADC1) == SET);  //查看硬件是否置0
    ADC_StartCalibration(ADC1); //启动校准
    while (ADC_GetCalibrationStatus(ADC1) == SET);
}

uint16_t AD_GetValue(void)
{
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);  // 软件触发转换
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待转换完成(规则组和注入组共用转换完成标志位)
    return ADC_GetConversionValue(ADC1);//返回数字量  读取ADC  DR寄存器,自动清除EOC标志位
}
View Code

可以采用均值滤波的方式平滑采样,使用施密特触发器的原理稳定控制开灯关灯

一般模式,打开一个通道,ADC转换,输出,关闭通道

注入通道:可以直接搬运4份ADC数据到寄存器,可同时显示(菜单,一次性上4份菜)

规则通道:16选1,对应的寄存只能存一份数据,要想显示多路,可配合DMA数据转运,一个接一个排队展示(菜单,一次只能上1份【避免数据覆盖】,被拿走后上下一份)

转换信号:

1软件触发,区分为规则组触发源和注入组触发源 

每隔1ms转换一次,可使用定时器来申请中断来转换(消耗资源);

2硬件触发

一般可以用定时器的更新事件选择为TRGO输出,在ADC那里选择触发信号为对应的TRGO,这样通过硬件触发ADC(无需中断)

也可以选择外部中断引脚来触发中断

模拟看门狗可用来监测

 C8T6,ADC引脚ADC12_IN0-9 ,ADC1和ADC2公用引脚,ADC1和ADC2可以同时采样双ADC模式,交叉模式,增加采样率

 

转换模式

单次转换非扫描: 一次一个通道,一次转换一个。 触发一次,转换一次。

连续转换非扫描:一次一个通道,连续转换。触发一次,连续转换不停,需要值直接读寄存器就行

单次转换扫描模式:一次触发,对多个通道依次转换,每个通道只转换一次

连续转换扫描模式:一次触发,对多个通道依次转换,每个通道连续转换

 ADC采样电压保持,采样事件长,避免毛刺,稳定;采样时间短,频率快

ADC校准,固定流程,在初始化函数后增加一些代码就行

传感器使用分压原理