ADC — ADC 唤醒单次转换
固件库: CIU32F003_STDLib V1.0.3
芯片: CIU32
源文件: CIU32/CIU32F003_STDLib_V1.0.3/Projects/ADC/ADC_Wakeup_SingleConversion_TriggerSW_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
57
58
59
60
61
62
63
64
65
|
#include "main.h"
int main(void)
{
/* ϵͳʱ */
system_clock_config();
/* Systickʼ */
std_delay_init();
/* GPIOʼ */
gpio_init();
/* UARTʼ */
uart_init();
/* ADCʼ */
adc_init();
/* NVICʼ */
nvic_init();
/* ADCУϵȣϵͳλִֻһ */
bsp_adc_software_calibrate();
/* ȴ3Sû */
std_delayms(3000);
while(1)
{
/* ʹͨVBGR */
std_adc_internal_channel_vbgr_enable();
/* ȴڲVBGRͨȶ */
std_delayus(ADC_VBGR_CHANNEL_DELAY);
/* ʹADC */
std_adc_enable();
/* ȴADCʹ״̬ȶ */
std_delayus(ADC_EN_DELAY);
/* ȡֵתΪѹֵλmV*/
bsp_adc_get_channel_voltage(g_voltage_buf);
/* ֹADC */
std_adc_disable();
/* رͨVBGR */
std_adc_internal_channel_vbgr_disable();
for(uint8_t i = 0; i < ADC_CHANNEL_NUM; i++)
{
/* ڴӡADCⲿͨתѹ */
printf("ADC sample voltage: %d mV\r\n",g_voltage_buf[i]);
}
/* deepstopģʽ */
std_pmu_enter_stop(PMU_MODE_DEEPSTOP, PMU_ENTRY_LOWPOWER_MODE_WFI);
/* Ѻָϵͳʱ */
system_clock_config();
}
}
|
代码讲解
系统时钟初始化:配置 MCU 的主频和时钟树。不同芯片的时钟配置不同,一般由工具生成。
printf 输出:通过串口打印调试信息。需要先调用 uart_print_init 完成重定向。
GPIO 配置:设置引脚为输出/输入模式,选择推挽/开漏输出,配置上拉/下拉。
ADC 配置:选择采样通道、采样时间、触发方式、数据对齐方式。采样时间越长精度越高。
中断优先级配置:NVIC 设置中断的抢占优先级和子优先级。数字越小优先级越高。
实验现象
- 串口助手打印 ADC 采样值
- 转动电位器时数值变化
- 温度传感器示例会显示芯片温度
注意事项
- ADC 参考电压影响测量精度
- 采样时间要根据信号源阻抗选择
- 使用前务必校准(Calibration)