通过ADC按钮,控制DAC输出正弦波

一、前言

在上一篇文章中说到,是可以实现通过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焊盘输出使能

参数

  • 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
	//计数器时钟分频器。分频器的范围是从 2 到 65536。

一系列配置:

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作为持续输出而得出的正弦波,没有太多难点,所以在这里做简单介绍!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值