干翻全岛蛙蛙 发表于 2024-6-11 09:02:33

STM32快速入门(ADC数模转换)

STM32快速入门(ADC数模转换)

前言

ADC数模转换存在的意义就是将一些温度传感器、各自数据传感器产生的模仿信号转换成方便识别和盘算的数字信号。
导航

图24 通用定时器框图:
https://img-blog.csdnimg.cn/direct/428399008563452f89393596a2b00dd7.png#pic_center
图片截取自STM32 F1XX中文参考手册。照旧以框图为中心,来叙述我对ADC的理解。
ACD实现细节

核心原理

所谓ADC转换目的是为了将连续变革的模仿量转酿成数字,方便程序的盘算。这里的模仿量不单单指代那些以正弦规律变革的波形,只要是连续变革的波形,我们都称它为模仿量。简朴来说,数模转化器就是按一定分辨率对连续变革的模仿信号进行切分,每一段都会给他进行数字编码,固然分辨越大,模仿信号被切分的越细,精度也会越准确。图片引用自知乎,如有侵权,可联系我将其删除,如图:
https://img-blog.csdnimg.cn/direct/c1da7860d90c46dc8b5cba7433f257a4.jpeg#pic_center
ADC转换器的实现是:起首对输入的模仿信号进行采样,由于数模转换的精度是确定的,以是会以精度来进行一个二分,每次取掷中的精度范围的中心数值,然后将数值通过DA转换,转换成模仿量,然后和采样的模仿量比较,判定巨细,再进行一次二分,终极确定采样的模仿量对应的数字编码是多少。这里帖一张简朴8位的ADC内部构造的原理图,图片引用自江协科技,如有侵权,联系我将其删除,如图2。
https://img-blog.csdnimg.cn/direct/44e24289bee94d06bf06cca39c3c0887.png#pic_center
图24的中心部门

回到图24,框图左侧ADCx_INx就是各个GPIO端口也称为通道,模仿信号可以从这里输入,旁边的GPIO端口矩形框,内部就是一个硬件开关,STTM32中的ACD一次可以处理多个ADC通道的转换,通道的转换就靠硬件开关来选择。我们这里重要讲规则通道的转换。注入通道原理其实是一样的。规则通道有16路通道,而输出寄存器只有一个,以是在完成一次通道的转换,我们就应该快速讲输出寄存器的值读取走,不然就会覆盖,一般会配合DMA利用。中心的模仿至数字转换器的内部原理就是图2所示。ADCCLK就是给ADC转换器的驱动时钟,和图2的CLOCK引脚对应。
图24的上半部门

图2上部门有毗连到输出寄存器(包罗1个规则通道寄存器、4个注入通道寄存器)的各种标志位,这些标志位都有相应的寄存器,并且也能触发停止。模仿看门狗的作用在图中也描述的非常明了,就是给定一个检测范围,在范围中就会触发标志位或停止。
图24的下半部门

下半部门就是描绘数模转换触发的一些方式,这里是支持硬件触发的软件触发。硬件触发包罗主模式下定时器的TRGO输出、以及定时器的输出通道、外部停止的触发等。各种触发方式和图2的START引脚对应。
实现ADC转换的细节记载

1. 起首要区分:间断模式和扫描模式、单次转换和连续转换。
所谓间断模式,就是一次触发只转换部门通道。所谓扫描,就是一次触发将规则组(注入组)的全部待转换的通道都转换完。
所谓单次转换,就是将规则组转换完了,就停止转换。所谓连续转换,就是规则组(注入组)转换完了,就自动从头开始新一轮的转换。
间断模式和扫描模式通过配置ADC_CR1.SCAN可以开启或者关闭扫描模式,规则组和注入组共用这一位。通过配置ADC_CR1.JDISCEN、ADC_CR1.DISCEN分别可以配置注入组或者规则组去启用或禁用间断模式。通过配置ADC_CR1.DISCNUM可以配置间断模式下规则组一次触发事件转换的通道数目,这里只强调规则组!中文手册并没提到注入组,现在不确认规则组是否也受该位的影响!扫描模式下,只有末了一个条目转换完毕才会置位EOC。
具体利用连续转换照旧单次转换,由ADC_CR2.CONT控制。
2. 关于看门狗的细节
规则组和注入组可以独立的开启模仿看门狗,分别利用ADC_CR1.AWDEN、ADC_CR1.JAWDEN,通过ADC_CR1.AWDSGL位可以实现扫描模式下让看门狗只监控一个特定通道,监督的通道号由ADC_CR1.AWDCH位给出。
3. 模式选择和触发方式
本文只讲解独立模式的配置,由ADC_CR1.DUALMOD可以配置是独立模式照旧双模式。规则组和注入组都可以独立配置触发方式。规则组通过ADC_CR2.EXTSEL选择触发源。典型值是,还须要利用ADC_CR2.EXTTRIG使能外部触发源。ADC_CR2.SWSTART置位可激活软件触发,使规则组开始转换。
4. 规则组和通道的关系
STM32F103系列规则组可以有16个条目(entry)(标号从1开始,范围),通道一共有18个(标号从0开始,范围)。
ADC1的模仿输入通道16和通道17在芯片内部门别连到了温度传感器和VREFINT。
ADC2的模仿输入通道16和通道17在芯片内部连到了VSS。
ADC3模仿输入通道9、14、15、16、17与Vss相连。
每个通道可以单独配置其采样时间。ADC_SMPRx(x=1、2)。通过配置ADC_SQRx(x=1、2、3)可以配置规则组每个条目指向哪个通道。此中ADC_SQR1.L可设置规则组中有用条目的长度(也即通道数目)。
盗取江协科技的图片如下:
https://img-blog.csdnimg.cn/direct/6830603195c846df93e79949639d6f5b.png#pic_center
ADC转换的库函数实现

硬件接线图如下:
https://img-blog.csdnimg.cn/direct/db1931561a6146c0857d0cd84960bd40.png#pic_center
https://img-blog.csdnimg.cn/direct/37a56c6a03a24743beca47ae543056d0.png#pic_center
GPIO对应的ADC如下:
https://img-blog.csdnimg.cn/direct/ab803a4020e444f79fc9559d76aec7ce.png#pic_center
由表可知,我们须要配置的是ADC3
GPIO配置如下:
https://img-blog.csdnimg.cn/direct/33fe08fa12744a2899412efb84a7bcf7.png#pic_center
核心代码如下:
void LunarADCInit(void) {
        GPIO_InitTypeDef GPIOF8_Cfg;
        ADC_InitTypeDef ADC3_Cfg;

        // 先配置ADCCLK预分频器                12M HZ
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);
        // 打开ADC1时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
        GPIOF8_Cfg.GPIO_Mode = GPIO_Mode_AIN;
        GPIOF8_Cfg.GPIO_Pin = GPIO_Pin_8;
        GPIOF8_Cfg.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOF, &GPIOF8_Cfg);

        ADC3_Cfg.ADC_ContinuousConvMode = ENABLE;                                        // 连续转换使能
        ADC3_Cfg.ADC_DataAlign = ADC_DataAlign_Left;
        ADC3_Cfg.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        // 软件触发
        ADC3_Cfg.ADC_Mode = ADC_Mode_Independent;                                        // 独立模式
        ADC3_Cfg.ADC_NbrOfChannel = 1;                                                                // 只转换一个序列
        ADC3_Cfg.ADC_ScanConvMode = ENABLE;                                                        // 使用扫描模式
        ADC_Init(ADC3, &ADC3_Cfg);

        ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 1, ADC_SampleTime_7Cycles5);        // 配置规则序列寄存器以及通道采样时间

        ADC_Cmd(ADC3, ENABLE);

        ADC_ResetCalibration(ADC3);
        while (ADC_GetResetCalibrationStatus(ADC3) == SET);        // 硬件置0

        ADC_StartCalibration(ADC3);
        while (ADC_GetCalibrationStatus(ADC3) == SET);        // 硬件置0


        ADC_SoftwareStartConvCmd(ADC3, ENABLE);
        while (ADC_GetFlagStatus(ADC3, ADC_FLAG_STRT) == RESET);
}

int main() {
        // 初始化usart
        LunarInitUSART1();
        LunarADCInit();

        SYSTick_Init();

        LunarNVICInit();

        printf("stm32 启动\n");

        int t = 3;
        while(1) {
                printf("light:%d\r\n", ADC_GetConversionValue(ADC3));
                while (t > 0){
                        t--;
                        Delay_Ms(1000);
                }
                t= 3;

        }

        return 0;
}
   实验征象就是手机背光照射光敏电阻时,ADC转换数值变小。
本章完结

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: STM32快速入门(ADC数模转换)