目录
概述
本文主要是使用AT32F403A开发板,基于V2库实现dac输出电压的功能。
串口工具使用的Atlink-ez自带的串口功能。
工程建立、调试工具配置在前面章节有详细介绍。
硬件
硬件方面使用的是参考官方AT32F437 SURF板子而设计的一个AT32F403A开发板,板子上的芯片是AT32F403AVGT7的型号,开发板上面还板载了一个atlink-ez的仿真器,atlink-ez除了可以在线仿真和下载之外还有一个串口的功能,硬件上是通过跳线帽接到了MCU的串口1,pa9/10上面。
如下图是开发板pcb图,以及硬件资源。(左边上角的就是atlink-ez,用usb线接到pc即可):
如下是实物图:
本章是dac输出的功能,dac1的输出默认io是pa4,测试时示波器直接接到pa4的排针即可
DAC
Dac即数模转换,和adc是相反的功能。常规下IO的拉低拉高就是0v和3.3v,dac可以产生0到参考电压之间的电压值。
AT32F403A的数模转换器(DAC)采用 12 位数字输入,产生 0 至参考电压之间的模拟输出。数字部分可以配置为 8 位或者12 位模式,支持单/双 DAC 的左对齐或者右对齐,同时可以与 DMA 配合使用。两个 DAC1/DAC2 各有一个数模转换器,每个 DAC1/DAC2 可以独立进行数模转换,也可以双DAC同时触发进行转换。
DAC1/2的通道只有这两个固定IO。
软件
初始化
本文使用DAC1来输出电压,也就是PA4,IO要设置为模拟输出模式,无上下拉。
开启DAC的时钟,设置触发模式,这里为软件触发模式,使能触发,使能DAC即可。需要输出电压时,先设置电压值,然后调用软件触发函数即可输出对应的电压。
初始化代码
/*
*DAC1初始化
*PA4
*软件触发
*
*/
void m_dac_init(void)
{
gpio_init_type gpio_init_struct = {0};
crm_periph_clock_enable(CRM_DAC_PERIPH_CLOCK, TRUE); //开启DAC时钟
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); //开启gpioa时钟
gpio_init_struct.gpio_pins = GPIO_PINS_4; //PA4
gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG; //模拟
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; //输出
gpio_init_struct.gpio_pull = GPIO_PULL_NONE; //无上下拉
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; //
gpio_init(GPIOA, &gpio_init_struct);
dac_trigger_select(DAC1_SELECT, DAC_SOFTWARE_TRIGGER); //设置软件触发模式
dac_trigger_enable(DAC1_SELECT, TRUE); //触发使能
dac_output_buffer_enable(DAC1_SELECT, TRUE); //使能 DAC 输出缓存
dac_enable(DAC1_SELECT, TRUE); // 使能DAC1
dac_1_data_set(DAC1_12BIT_RIGHT,0); //设置输出0v电压
dac_software_trigger_generate(DAC1_SELECT); //软件触发设置值
}
测试
测试代码
先输出2v电压持续1ms,然后输出0v电压持续1ms,循环。
测试结果
实际输出的电压和软件设置的输出电压一致。
最后
有问题的可以加QQ群技术交流,同时相关代码上传到QQ群中。