(十六)零基础开发小安派-Eyes-S1【外设篇】——DAC

[复制链接]
查看1610 | 回复9 | 2023-12-22 18:11:39 | 显示全部楼层 |阅读模式

本帖最后由 Ai-Thinker小泽 于 2023-12-22 18:11 编辑

零基础开发小安派-Eyes-S1【外设篇】——DAC

既然有ADC,自然就会有DAC啦,ADC是将模拟量转化为数字量,那么DAC就是相反的,将数字量转化为模拟量(电压)输出。

DAC 模块是 12 位电压输出数模转换器,可与 DMA 控制器配合使用。芯片内置的 DAC 模块有两个输出通道,每个通道各有一个独立的转换器,可以互不影响单独进行数模转换。另外此 DAC 的转化器还可以作为 AudioDAC 的模拟输出通道。可用于音频播放,变送器电压调制等应用。

一、了解小安派-Eyes-S1的DAC

小安派-Eyes-S1具有两个通道的DAC,对应通道A和通道B,他们的IO口也是固定的,通道A对应IO3,通道B对应IO2。

其DAC具有以下特点:

• DAC 调制精度为 12-bit • DAC 的数模转化器可以作为 AudioDAC 模块的模拟输出通道 • DAC 的输入时钟可选为 32MHz,xclk 或者来自于 AudioDAC 模块 • 支持 DMA 功能,支持 10 种数据传输格式 • 支持 DAC 双通道同时转换 • DAC 的输出引脚固定为 ChannelA 为 GPIO3,ChannelB 为 GPIO2 • 支持内部和外部输入参考电压

DAC分频有以下四种选择,其中在DMA模式可使用1分频:

#define DAC_CLK_DIV_16 0
#define DAC_CLK_DIV_32 1
#define DAC_CLK_DIV_64 3
#define DAC_CLK_DIV_1  4

二、结构体与函数接口

bflb_dac_init

说明: 初始化 dac。dac 使用之前需要开启 dac ip 时钟、设置 dac 时钟源和分频值、选择使用的 gpio 为 analog 模式。

void bflb_dac_init(struct bflb_device_s *dev, uint8_t clk_div);
parameter description
dev 设备句柄
config 配置项

bflb_dac_deinit

说明: 反初始化 dac。

void bflb_dac_deinit(struct bflb_device_s *dev);
parameter description
dev 设备句柄

bflb_dac_link_txdma

说明: dac dma 开关使能。

void bflb_dac_link_txdma(struct bflb_device_s *dev, bool enable);
parameter description
dev 设备句柄
enable 是否使能DMA

bflb_dac_channel_enable

说明: dac 通道使能。

void bflb_dac_channel_enable(struct bflb_device_s *dev, uint8_t ch);
parameter description
dev 设备句柄
ch 通道,多个通道之间使用“与”连接

bflb_dac_channel_disable

说明: dac 通道关闭。

void bflb_dac_channel_disable(struct bflb_device_s *dev, uint8_t ch);
parameter description
dev 设备句柄
ch 通道,多个通道之间使用 “与”连接

bflb_dac_set_value

说明: 更改 dac 通道值。

void bflb_dac_set_value(struct bflb_device_s *dev, uint8_t ch, uint16_t value);
parameter description
dev 设备句柄
ch 通道,多个通道之间使用 “与 ”连接
value 通道值

三、简单示例——DAC输出正弦波

本来想给大家画一个爱心的波形,但出于种种不可抗力(绝不是我懒)的缘故,没画出来。用官方示例中的数组输出一个正弦波形给大家演示。

#include "bflb_dac.h"
#include "bflb_mtimer.h"
#include "board.h"
#include "bflb_gpio.h"

struct bflb_device_s *dac;

void My_dac_gpio_init()
{
    struct bflb_device_s* gpio;

    gpio = bflb_device_get_by_name("gpio");
    /* DAC_CHA */
    bflb_gpio_init(gpio, GPIO_PIN_3, GPIO_ANALOG | GPIO_SMT_EN | GPIO_DRV_0);
}


uint16_t SIN_LIST[] = {
    500, 506, 513, 519, 525, 531, 538, 544, 550, 556,
    563, 569, 575, 581, 587, 594, 600, 606, 612, 618,
    624, 630, 636, 642, 648, 654, 660, 666, 672, 678,
    684, 690, 696, 701, 707, 713, 718, 724, 730, 735,
    741, 746, 752, 757, 762, 768, 773, 778, 784, 789,
    794, 799, 804, 809, 814, 819, 823, 828, 833, 838,
    842, 847, 851, 856, 860, 864, 869, 873, 877, 881,
    885, 889, 893, 897, 901, 904, 908, 912, 915, 919,
    922, 925, 929, 932, 935, 938, 941, 944, 947, 950,
    952, 955, 958, 960, 962, 965, 967, 969, 971, 973,
    975, 977, 979, 981, 983, 984, 986, 987, 989, 990,
    991, 992, 993, 994, 995, 996, 997, 997, 998, 999,
    999, 999, 1000, 1000, 1000, 1000, 1000, 1000, 1000,
    999, 999, 999, 998, 998, 997, 996, 995, 994, 993,
    992, 991, 990, 989, 987, 986, 984, 983, 981, 979,
    978, 976, 974, 972, 970, 967, 965, 963, 960, 958, 955, 953, 950, 947, 944, 941, 938, 935,
    932, 929, 926, 922, 919, 916, 912, 908, 905, 901, 897, 893, 890, 886, 882, 878, 873, 869,
    865, 861, 856, 852, 847, 843, 838, 833, 829, 824, 819, 814, 809, 804, 799, 794, 789, 784,
    779, 774, 768, 763, 758, 752, 747, 741, 736, 730, 725, 719, 714, 708, 702, 696, 691, 685, 679,
    673, 667, 661, 655, 649, 643, 637, 631, 625, 619, 613, 607, 601, 594, 588, 582, 576, 570, 563,
    557, 551, 545, 538, 532, 526, 520, 513, 507, 501, 495, 488, 482, 476, 469, 463, 457, 451, 444,
    438, 432, 426, 420, 413, 407, 401, 395, 389, 383, 376, 370, 364, 358, 352, 346, 340, 334, 329,
    323, 317, 311, 305, 299, 294, 288, 282, 277, 271, 265, 260, 254, 249, 244, 238, 233, 228, 222,
    217, 212, 207, 202, 197, 192, 187, 182, 177, 172, 168, 163, 158, 154, 149, 145, 141, 136, 132, 128, 124,
    119, 115, 111, 107, 104, 100, 96, 92, 89, 85, 82, 78, 75, 72, 69, 65, 62, 59, 56, 54, 51, 48, 45, 43, 40, 38,
    36, 33, 31, 29, 27, 25, 23, 21, 19, 18, 16, 14, 13, 12, 10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 8, 9, 10, 11,
    12, 14, 15, 17, 19, 20, 22, 24, 26, 28, 30, 32, 35, 37, 39, 42, 44, 47, 50, 52, 55, 58, 61, 64, 67, 71, 74, 77, 81, 84, 87, 91, 95, 98, 102, 106, 110, 114, 118, 122,
    126, 130, 135, 139, 143, 148, 152, 157, 161, 166, 171, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 226, 231, 236, 242, 247, 252, 258, 263, 269, 274, 280, 286,
    291, 297, 303, 309, 315, 320, 326, 332, 338, 344, 350, 356, 362, 368, 374, 380, 386, 392, 399, 405, 411, 417, 423, 430, 436, 442, 448, 455, 461, 467, 473, 480, 486, 492
};
// 输出正弦波的电压值数组

int main(void)
{
    board_init();
    My_dac_gpio_init();

    dac = bflb_device_get_by_name("dac");

    /* 512K / 16 = 32K */
    bflb_dac_init(dac, DAC_CLK_DIV_16);
    // 16分频
    bflb_dac_channel_enable(dac, DAC_CHANNEL_A);
    //选择通道A,对应GPIO3
    printf("DAC Start\r\n");

    while (1) {

            for (uint16_t i = 0; i < sizeof(SIN_LIST) / sizeof(uint16_t); i++) {
        bflb_dac_set_value(dac, DAC_CHANNEL_A, SIN_LIST[i]);
        bflb_mtimer_delay_us(100);
     }
        }
        bflb_mtimer_delay_ms(200);
        // 循环输出波形
}

正弦波形:

81d42350aff529a874b65c3e0058778.png

翻车的爱心波形:

85c63e1ef11ccb9bf9d4afb639bef59.png

本帖被以下淘专辑推荐:

回复

使用道具 举报

lovzx | 2023-12-22 18:30:02 | 显示全部楼层
泽哥v5
回复

使用道具 举报

1084504793 | 2023-12-23 12:47:20 | 显示全部楼层
回复

使用道具 举报

lazy | 2023-12-23 14:58:04 | 显示全部楼层
大佬就是厉害
回复 支持 反对

使用道具 举报

bzhou830 | 2023-12-23 16:47:24 | 显示全部楼层
泽哥v5
选择去发光,而不是被照亮
回复

使用道具 举报

King6688 | 2023-12-23 23:46:14 | 显示全部楼层
其他都不重要,重要的是翻车
回复 支持 反对

使用道具 举报

爱笑 | 2023-12-25 08:39:35 | 显示全部楼层
用心做好保姆工作
回复

使用道具 举报

AXK123456 | 2023-12-25 09:29:01 | 显示全部楼层
个大佬点赞
回复 支持 反对

使用道具 举报

axkkj | 2024-4-23 19:35:49 | 显示全部楼层
向博主学习
回复 支持 反对

使用道具 举报

djy876 | 2024-9-3 11:46:57 | 显示全部楼层
学习打卡
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则