通付盾 建设网站公司,做彩票网站都是怎么拉人的,wordpress标题间隔符修改,网站建设目标及需求14.1 实验内容
通过本实验主要学习以下内容#xff1a;
DAC工作原理
使用DAC输出电压
14.2 实验原理
14.2.1 DAC工作原理
我们上几章学习了ADC#xff0c;本章我们来学习DAC。ADC是模-数转换#xff0c;即模拟量转换为数字量#xff0c;DAC正好相反#xff0c;即数-…
14.1 实验内容
通过本实验主要学习以下内容
DAC工作原理
使用DAC输出电压
14.2 实验原理
14.2.1 DAC工作原理
我们上几章学习了ADC本章我们来学习DAC。ADC是模-数转换即模拟量转换为数字量DAC正好相反即数-模转换是将MCU的数字量转换为模拟量——电压。
GD32F303有两个DAC对应的IO口分别为PA4DAC0和PA5DAC1这两个DAC可以独立或并发工作。DAC可以将 12 位的数字数据转换为外部引脚上的电压输出。数据可以采用8位或12位左对齐或右对齐模式。
如设置12位模式IO口上输出的电压值和设置的数字值对应的计算公式为 其中VREF为参考电压DAC_DO为设置的数字值。
DAC 的主要特征如下
◼ 8 位或 12 位分辨率数据右对齐或左对齐
◼ 支持 DMA 功能
◼ 同步更新转换
◼ 外部事件触发转换
◼ 可配置的内部缓冲区
◼ 外部参考电压 VREF
◼ 噪声波形(LSFR 噪声模式和三角噪声模式)
◼ 双 DAC 并发模式
以下为GD32F303 DAC的框图
这里着重讲下DAC的触发源DAC触发源通过DAC_CTL寄存器中 DTSELx 位来进行选择。DAC的触发源见下表 DAC有两个类型的数据寄存器——DAC保持数据寄存器DACx_DH和DAC 数据输出寄存器DACx_DO用户将数字量写入到DACx_DH中只有当DACx_DH中的数据被转移到DACx_DO时IO口才会实际输出对应电压值。
当使能了外部触发模式通过设置 DAC_CTL 寄存器的 DTENx 位控制当已经选择的触发事件发生 DAC 保持数据DACx_DH会被转移到 DAC 数据输出寄存器DACx_DO。如果没有使能外部触发模式当数据写到DACx_DH后就会立即转移到DACx_DO中此时相应IO口即输出对应电压。
14.2.2 DAC 输出缓冲
为了降低输出阻抗并驱动外部负载每个DAC 模块内部各集成了一个输出缓冲区。
缺省情况下 输出缓冲区是开启的可以通过设置 DAC_CTL 寄存器的 DBOFFx 位来开启或关闭缓冲区。打开缓冲区可以增强DAC对外驱动能力。
14.2.3 DAC DMA 功能
在外部触发使能的情况下通过设置 DAC_CTL 寄存器的DDMAENx 位来使能 DMA 请求。 当有外部硬件触发的时候不是软件触发则产生一个DMA 请求。
14.3 硬件设计
本实验功能是将设定的数字值转换为电压硬件设计如下 可以看到是使用PA5即DAC1输出电压读者可以通过测量H9口进行电压测量
14.4 代码解析
14.4.1 DAC 配置函数
在driver_dac.c中定义了DAC的配置函数driver_dac_config
C
void driver_dac_config(uint32_t dac_periph)
{/*使能GPIOA时钟*/rcu_periph_clock_enable(RCU_GPIOA);/*使能DAC时钟*/rcu_periph_clock_enable(RCU_DAC);/*依据选择的DAC号来初始化IO口*/if(dac_periph DAC0){gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4);}else{gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5);}/*DAC复位*/dac_deinit();/*DAC外部触发禁能即数据写入到保持寄存器就会自动输出电压*/dac_trigger_disable(dac_periph);/*DAC噪声关闭*/dac_wave_mode_config(dac_periph, DAC_WAVE_DISABLE);/*输出缓冲打开*/dac_output_buffer_enable(dac_periph); /*DAC使能*/dac_enable(dac_periph);
}
14.4.2 DAC数据写入函数
在driver_dac.c中定义了DAC的数据写入函数driver_dac_out调用这个函数后即将数字值写入到DAC数据保持寄存器中
Cvoid driver_dac_out(uint32_t dac_periph, uint32_t dac_align, uint16_t data){/*写入数据到DAC保持寄存器*/dac_data_set(dac_periph,dac_align,data);}14.4.3 main函数实现
以下为main函数代码
C
int main(void)
{driver_init();//delay函数初始化bsp_uart_init(BOARD_UART);//BOARD_UART串口初始化driver_dac_config(DACx);//DAC配置while (1){ delay_ms(200);//延时200msDAC_data 200;//DAC_data值自增加200if(DAC_data4000)//DAC防止溢出{DAC_data 0; }printf( the DAC_data is %d \r\n, DAC_data);//打印DAC data数据driver_dac_out(DACx,DAC_ALIGN_12B_R,DAC_data);//输出电压}
}
本例程main函数首先进行了延时函数初始化再配置开发板上的USB串口接着进行DAC配置。DAC配置函数中的实参通过main.c中定义读者可根据实际需求修改
C
#define DACx DAC1 main函数主循环中每200ms自增DAC_data 值并将该值写入到数据保存寄存器中然后将DAC_data 值打印出来。
14.5 实验结果
使用外用表测量开发板H9接口上的电压值可以看到电压循环从低到高的变化。 由聚沃科技原创来源于【红枫派开发板】第十四讲 DAC-输出电压实验 - 苏州聚沃电子科技有限公司 (gd32bbs.com)