一、前言
在上一篇文章中说到,是可以实现通过ADC按钮,控制DAC输出正弦波,这次就来实现一下:这次项目主要参考官方例程dma_read和wave_gen,其中ADC的按钮是采集不同的电压输出,通过一个GPIO实现多种控制,而wave_gen的作用是通过ADC检测到的不同电压,来输出不同形式的正弦波,话不多说,进入实战!
二、概述
在上一期已经详细介绍过ADC,在这里主要介绍一下DAC的功能和API.
2.1 功能介绍
- DAC的主要作用是将检测的数字信号转变为模拟信号输出
- ESP32有两个8-bitDAC通道,分别连接到GPIO25(通道1)和GPIO26(通道2)。
- DAC驱动器预先将这些通道设置为任意电压。
- 当使用“内置DAC模式”时,DAC通道也可以由数字控制器通过I2S驱动程序以DMA样式写入样本数据驱动。
2.2 DAC API介绍
esp_err_t dac_pad_get_io_num(dac_channel_t channel, gpio_num_t *gpio_num)
获取特定 DAC 通道的 GPIO 编号。
参数
- channel – 获取 gpio 编号的通道
- gpio_num – 保存 gpio 编号的输出缓冲区
返回 - ESP_OK 如果成功
esp_err_t dac_output_voltage(dac_channel_t channel, uint8_t dac_value)
设置 DAC 输出电压。DAC 输出为 8 位。最大值 (255) 对应于 VDD3P3_RTC。
参数
- channel - DAC通道
- dac_value – DAC 输出值
esp_err_t dac_output_enable(dac_channel_t channel)
DAC焊盘输出使能
参数
2.3 DAC输出波形
众所周知,波形都是连续输出的,但在这里的DAC还只能一点一点输出,而想做到连续输出波形,就必须借助定时器来对波形进行连续输出: 定时器的初始化
struct timer_config_t
参数成员:
timer_alarm_t alarm_en
timer_start_t counter_en
timer_intr_mode_t intr_type
timer_count_dir_t counter_dir
timer_autoreload_t auto_reload
uint32_t divider
一系列配置:
esp_err_t timer_init(timer_group_t group_num, timer_idx_t timer_num, const timer_config_t *config)
初始化和配置定时器。
参数
- group_num – 定时器组号,0 代表 TIMERG0 或 1 代表 TIMERG1
- timer_num – 定时器索引,hw_timer[0] 为 0,hw_timer[1] 为 1
- config – 指向定时器初始化参数的指针。
esp_err_t timer_set_counter_value(timer_group_t group_num, timer_idx_t timer_num, uint64_t load_val)
将计数器设置为硬件定时器
参数
- group_num – 定时器组,0 代表 TIMERG0 或 1 代表 TIMERG1
- timer_num – 定时器索引,hw_timer[0] 为 0,hw_timer[1] 为 1
- load_val – 写入硬件定时器的计数器值。
esp_err_t timer_set_alarm_value(timer_group_t group_num, timer_idx_t timer_num, uint64_t alarm_value)
设置定时器报警值。
参数
- group_num – 定时器组,0 代表 TIMERG0 或 1 代表 TIMERG1
- timer_num – 定时器索引,hw_timer[0] 为 0,hw_timer[1] 为 1
- alarm_value – 用于设置警报值的 64 位值。
esp_err_t timer_enable_intr(timer_group_t group_num, timer_idx_t timer_num)
启用定时器中断。
参数
- group_num – 定时器组号,0 代表 TIMERG0 或 1 代表 TIMERG1
- timer_num – 定时器索引。
esp_err_t timer_isr_register(timer_group_t group_num, timer_idx_t timer_num, void (*fn)(void*), void *arg, int intr_alloc_flags, timer_isr_handle_t *handle)
注册 Timer 中断处理程序,该处理程序是一个 ISR。处理程序将附加到运行此函数的同一 CPU 内核。
参数
- group_num – 定时器组号
- timer_num – 定时器组的定时器索引
- fn——中断处理函数。
- arg - 处理函数的参数
- intr_alloc_flags – 用于分配中断的标志。一个或多个 (ORred) ESP_INTR_FLAG_* 值。有关更多信息,请参见 esp_intr_alloc.h。
- handle – 指向返回句柄的指针。如果非 NULL,将在此处返回中断句柄。
波形输出方程:
(int)((sin(i * CONST_PERIOD_2_PI / pnt_num) + 1) * (double)(AMP_DAC) / 2 + 0.5);
其中 i * CONST_PERIOD_2_PI / pnt_num为角频率;+ 1为初相;(AMP_DAC) / 2 + 0.5为振幅,只要改变相对应的值,相对应的值与相对于的按钮进行对照,就得出不同的正弦波进行输出。
三、总结
本次项目主要依靠ADC作为输入,DAC作为持续输出而得出的正弦波,没有太多难点,所以在这里做简单介绍!
|