• STM32学习笔记(七)--ADC详解


    (1)配置步骤
    1.配置RCC外设时钟 开启GPIO以及ADC外设
    2.配置预分配ADCCLK 不能超过14MHZ 一般都是除于6
    3.配置GPIO口 初始化为模拟输入的配置 设置专属模式
    4.选择规则组的输入通道 选择ADCx以及通道等 去看引脚图
    5.配置ADC 初始化配置
    6.配置中断以及定时器等等 (需要即配置)
    7.开启ADC的电源
    8.开启ADC的校准

    (2)代码示例
    案例1  ADC1单通道 PA0单通道模拟输入实例 单次转化非扫描

    1. void AD_Init(void)
    2. {
    3. //开启对应的RCC时钟外设 要用的GPIO口以及选择的ADC
    4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    6. //进行预分配处理 该晶振为72MHZ除于预分频值要比14MHZ小才行
    7. RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    8. //进行GPIO的初始化配置 注意的是选择模式为模拟输入
    9. GPIO_InitTypeDef GPIO_InitStructure;
    10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    13. GPIO_Init(GPIOA, &GPIO_InitStructure);
    14. //选择规则组的输入通道 1、2参数根据引脚图 3参数是次序(1-16)4参数采样时间
    15. ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
    16. //初始化ADC具体函数功能下文会阐述
    17. ADC_InitTypeDef ADC_InitStructure;
    18. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    19. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    20. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    21. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    22. ADC_InitStructure.ADC_ScanConvMode = DISABLE;//连续转化非扫描ENABLE
    23. ADC_InitStructure.ADC_NbrOfChannel = 1;
    24. ADC_Init(ADC1, &ADC_InitStructure);
    25. //开启ADC电源 启动ADC
    26. ADC_Cmd(ADC1, ENABLE);
    27. //进行ADC校准
    28. //复位校准
    29. ADC_ResetCalibration(ADC1);
    30. //等待复位校准完成
    31. while (ADC_GetResetCalibrationStatus(ADC1) == SET);
    32. //开始校准
    33. ADC_StartCalibration(ADC1);
    34. //等待校准完成
    35. while (ADC_GetCalibrationStatus(ADC1) == SET);
    36. //连续转化非扫描ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    37. }
    38. //单次转化非扫描
    39. uint16_t AD_GetValue(void)
    40. {
    41. //触发ADC转换
    42. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    43. //获取ADC转换标志位状态的函数
    44. while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    45. //获取ADC转换的函数 会自动清除标志位
    46. return ADC_GetConversionValue(ADC1);
    47. }
    48. /*连续转化非扫描
    49. uint16_t AD_GetValue(void)
    50. {
    51. return ADC_GetConversionValue(ADC1);
    52. }*/

    案例2  ADC1多通道 PA0123多通道模拟输入实例 标黄处做修改即可

    1. void AD_Init(void)
    2. {
    3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    5. RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    6. GPIO_InitTypeDef GPIO_InitStructure;
    7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    10. GPIO_Init(GPIOA, &GPIO_InitStructure);
    11. ADC_InitTypeDef ADC_InitStructure;
    12. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    13. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    14. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    15. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    16. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    17. ADC_InitStructure.ADC_NbrOfChannel = 1;
    18. ADC_Init(ADC1, &ADC_InitStructure);
    19. ADC_Cmd(ADC1, ENABLE);
    20. ADC_ResetCalibration(ADC1);
    21. while (ADC_GetResetCalibrationStatus(ADC1) == SET);
    22. ADC_StartCalibration(ADC1);
    23. while (ADC_GetCalibrationStatus(ADC1) == SET);
    24. }
    25. uint16_t AD_GetValue(uint8_t ADC_Channel)
    26. {
    27. ADC_RegularChannelConfig(ADC1,ADC_Channel,1, ADC_SampleTime_55Cycles5);
    28. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    29. while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    30. return ADC_GetConversionValue(ADC1);
    31. }
    32. //
    33. uint16_t AD0, AD1, AD2, AD3;
    34. int main(void)
    35. {
    36. OLED_Init();
    37. AD_Init();
    38. OLED_ShowString(1, 1, "AD0:");
    39. OLED_ShowString(2, 1, "AD1:");
    40. OLED_ShowString(3, 1, "AD2:");
    41. OLED_ShowString(4, 1, "AD3:");
    42. while (1)
    43. {
    44. AD0 = AD_GetValue(ADC_Channel_0);
    45. AD1 = AD_GetValue(ADC_Channel_1);
    46. AD2 = AD_GetValue(ADC_Channel_2);
    47. AD3 = AD_GetValue(ADC_Channel_3);
    48. OLED_ShowNum(1, 5, AD0, 4);
    49. OLED_ShowNum(2, 5, AD1, 4);
    50. OLED_ShowNum(3, 5, AD2, 4);
    51. OLED_ShowNum(4, 5, AD3, 4);
    52. Delay_ms(100);
    53. }
    54. }

    (3)函数分析

    函数1:void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)

    (stm32f10x_adc.h) 该函数为初始化ADC函数,其ADC_InitTypeDef结构体成员变量如下所示。

    序号

    名称

    参数解释

    示例

    参数1

    ADC_Mode

    ADC的工作模式独立、双AD

    ADC_Mode_Independent(就此为独立模式 其余都是双AD 相对复杂)

    参数2

    ADC_DataAlign

    数据对齐

    ADC_DataAlign_Right(右对齐)

    参数3

    ADC_ExternalTrigConv

    外部触发转换选择 触发源

    ADC_ExternalTrigConv_None(不使用外部触发 内部软件触发)

    参数4

    ADC_ContinuousConvMode

    选择连续转换还是单次转换

    DISABLE(单次模式)

    ENABLE(连续模式)

    参数5

    ADC_ScanConvMode

    选择扫描还是非扫描

    DISABLE(非扫描模式)

    ENABLE(扫描模式)

    参数6

    ADC_NbrOfChannel

    (非扫描模式下此参数无用)

    指定扫描模式下会用到几个通道

    1(1-16之间)

     

  • 相关阅读:
    无线蓝牙耳机什么牌子好一点?2022年蓝牙耳机推荐
    疫情之下,普通人高薪就业指南:学软件测试,路就不会遥远
    七牛云QRTC背后的质量提升实践
    python爬虫入门详细教程-采集云南招聘网数据保存为csv文件
    Codeforces Round 949 (Div. 2 ABCD) 视频讲解
    用vba实现将记录集输出到Excel模板
    Nginx + RTMP + nginx-http-flv-module 环境搭建(CentOS 7)
    Shell 脚本特殊变量列表
    Covariance Estimators协方差估计大比拼:性能、应用场景和可视化对比总结
    js基础之函数
  • 原文地址:https://blog.csdn.net/weixin_64593595/article/details/139760629