本帖最后由 jinglixixi 于 2024-11-27 19:14 编辑
AT32L021内置了12位的模拟/数字转换器,可通过多达15个外部通道和3个内部通道,并可配置在12/10/8/6位分辨率下采样。 在对通道5进行采集的情况下,通过PA5来输入模拟信号就可完成检测的任务。 为了能直观地观察到检测的结果,就将下面介绍的数码管显示模块与其配合工作,此时数码管所连接的引脚关系为: CLK---PB8 DIN---PB9 CS---PA7
对所用引脚的功能配置函数为: void smg_config(void)
{
gpio_init_type gpio_init_struct;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_init_struct);
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_7;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
gpio_init_struct.gpio_pins = GPIO_PINS_8|GPIO_PINS_9;
gpio_init(GPIOB, &gpio_init_struct);
}
实现电压检测的主程序为: int main(void)
{
__IO uint32_t index = 0;
__IO uint8_t w = 0;
__IO uint32_t u,V;
system_clock_config();
at32_board_init();
at32_led_off(LED2);
at32_led_off(LED3);
at32_led_off(LED4);
uart_print_init(115200);
gpio_config();
dma_config();
adc_config();
smg_config();
Init_MAX7219();
while(1)
{
at32_led_toggle(LED2);
delay_sec(1);
if(vmor_flag_index == 1)
{
vmor_flag_index = 0;
w=33*adc1_ordinary_valuetab[1]/4095;
Write_Max7219(1,w%10);
Write_Max7219(2,10);
Write_Max7219(3,w%100/10);
Write_Max7219(4,15);
Write_Max7219(5,adc1_ordinary_valuetab[1]%10);
Write_Max7219(6,adc1_ordinary_valuetab[1]%100/10);
Write_Max7219(7,adc1_ordinary_valuetab[1]%1000/100);
Write_Max7219(8,adc1_ordinary_valuetab[1]/1000);
}
adc_ordinary_software_trigger_enable(ADC1, TRUE);
}
}
经程序的编译和下载,其运行的结果如图1至图3所示,其中左侧显示的是检测值,右侧显示的是电压值。由于数码管显示模块无法显示出小数点,故以横线来代替。 图1 检测3.3V电压
图2 检测GND电压
图3 悬空状态检测值
在此基础上,通过添加外挂的NTC温度检测模块,就实现温度的检测,所添加的功能处理程序为: u=3300*adc1_ordinary_valuetab[1]/4095;
if((u<=1644) && (u>1268))
V=10+(1644-u)/37;
if((u<=1268) && (u>947))
V=20+(1268-u)/32;
if((u<=947) && (u>692))
V=30+(947-u)/25;
Write_Max7219(1,V%10);
Write_Max7219(2,V%100/10);
Write_Max7219(3,15);
Write_Max7219(4,15);
这样就可以将检测的温度在数码管上显示了,其检测效果如图4和图5所示。 图4 室温检测
图5 体温检测
因此看出,AT32L021的A/D检测功能还是很便于使用的。
|