CIU32 ADC — ADC 不连续转换定时触发

CIU32 CIU32F003_STDLib V1.0.3 ADC ADC 不连续转换定时触发 示例教学

ADC — ADC 不连续转换定时触发

固件库: CIU32F003_STDLib V1.0.3
芯片: CIU32
源文件: CIU32/CIU32F003_STDLib_V1.0.3/Projects/ADC/ADC_DiscontinuousConversion_TriggerTime_Poll/Source/main.c


功能简介

本示例演示 ADC 模数转换器的基本用法。ADC 将模拟电压信号转换为数字值,是读取传感器数据的关键外设。

硬件准备

  • 电位器(可调电阻)连接到 ADC 输入引脚
  • 或使用内部温度传感器(无需额外硬件)

完整代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "main.h"
#define VREF_ADC_VDDA_VOLTAGE        (3300U)
#define ADC_CHANNEL_NUM              (1U)
__IO uint32_t g_voltage_buf[ADC_CHANNEL_NUM];

int main(void)
{
    uint32_t i;
    
    /* ϵͳʱ(RCH 48MHz) */
    system_clock_config(); 
    
    /* ʱʼ */
    std_delay_init();

    /* GPIOʼ */
    gpio_init();

    /* TIM3ʼ */
    tim3_init();

    /* ADCʼ */
    adc_init();
    
    /* ADCУ׼ϵȣϵͳλִֻһ */ 
    bsp_adc_software_calibrate();
    
    /* ʹTIM3 */
    std_tim_enable(TIM3);
    
    /* ת */
    std_adc_start_conversion();

    while(1)
    {
        /* ǰʾ1ͨͨ޸ADC_CHANNEL_NUMͬʱʹܶӦͨԼ */
        for(i=0; i<ADC_CHANNEL_NUM; i++)
        {
            /* TIM31sһADCADCǰͨѹֵ */
            while(std_adc_get_flag(ADC_FLAG_EOC) == 0U);

            /* EOC־ */
            std_adc_clear_flag(ADC_FLAG_EOC);
            
            /* ȡֵתΪѹֵλmV */
            g_voltage_buf[i] = std_adc_get_conversion_value() * VREF_ADC_VDDA_VOLTAGE / ADC_CONVER_SCALE;  
        }
        
        /* ȴһת */
        while(std_adc_get_flag(ADC_FLAG_EOS) == 0U);
        
        /* EOS־ */
        std_adc_clear_flag(ADC_FLAG_EOS);
        
    } 
}

代码讲解

系统时钟初始化:配置 MCU 的主频和时钟树。不同芯片的时钟配置不同,一般由工具生成。

GPIO 配置:设置引脚为输出/输入模式,选择推挽/开漏输出,配置上拉/下拉。

ADC 配置:选择采样通道、采样时间、触发方式、数据对齐方式。采样时间越长精度越高。

实验现象

  • 串口助手打印 ADC 采样值
  • 转动电位器时数值变化
  • 温度传感器示例会显示芯片温度

注意事项

  • ADC 参考电压影响测量精度
  • 采样时间要根据信号源阻抗选择
  • 使用前务必校准(Calibration)
世界是你们
使用 Hugo 构建
主题 StackJimmy 设计