1 /*
2  * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2024-12-30     CDT          first version
9  */
10 
11 /*
12  * 程序清单: DAC 设备使用例程
13  * 例程导出了 dac_vol_sample 命令到控制终端
14  * 命令调用格式:dac_vol_sample  参数1:dac1 | dac2  参数2:DAC配置值 (可选,范围0-4095),默认1365≈1.1V
15  * 程序功能:通过 DAC 设备将数字值转换为模拟量,并输出电压值。将示波器通道连接到输出引脚,观察输出电压值
16  *          示例代码参考电压为3.3V,转换位数为12位。
17  */
18 #include <rtthread.h>
19 #include <rtdevice.h>
20 #include <stdlib.h>
21 
22 #ifdef BSP_USING_DAC
23 
24 #define REFER_VOLTAGE                   330     /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
25 #define DAC_MAX_OUTPUT_VALUE            4095
26 
27 #if (defined (HC32F4A8) || defined (HC32F4A0)) && defined (BSP_USING_DAC2)
28     extern void EthPhyDisable(void);
29 #endif /* HC32F4A8 && BSP_USING_DAC2 */
30 
dac_vol_sample(int argc,char * argv[])31 static int dac_vol_sample(int argc, char *argv[])
32 {
33     char dac_device_name[] = "dac1";
34     rt_uint8_t channel = 1;
35     rt_dac_device_t dac_dev;
36     rt_uint32_t value = 1365; /* 默认1.1V */
37     rt_uint32_t convertBits;
38     rt_uint32_t vol;
39     rt_err_t ret = RT_EOK;
40 
41     /* 参数无输入或者输入错误按照默认值处理 */
42     if (argc >= 2)
43     {
44         if (0 == rt_strcmp(argv[1], "dac1"))
45         {
46             rt_strcpy(dac_device_name, "dac1");
47         }
48 #if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8)
49         else if (0 == rt_strcmp(argv[1], "dac2"))
50         {
51             rt_strcpy(dac_device_name, "dac2");
52         }
53 #endif
54 #if defined (HC32F472)
55         else if (0 == rt_strcmp(argv[1], "dac3"))
56         {
57             rt_strcpy(dac_device_name, "dac3");
58         }
59         else if (0 == rt_strcmp(argv[1], "dac4"))
60         {
61             rt_strcpy(dac_device_name, "dac4");
62         }
63 #endif
64         else
65         {
66             rt_kprintf("The chip hasn't the dac unit!\r\n");
67             return -RT_ERROR;
68         }
69     }
70 #if (defined (HC32F4A8) || defined (HC32F4A0)) && defined (BSP_USING_DAC2)
71     EthPhyDisable();
72 #endif
73     /* 查找设备 */
74     dac_dev = (rt_dac_device_t)rt_device_find(dac_device_name);
75     if (dac_dev == RT_NULL)
76     {
77         rt_kprintf("dac sample run failed! can't find %s device!\n", dac_device_name);
78         return -RT_ERROR;
79     }
80 
81     if (RT_EOK != rt_device_control(&dac_dev->parent, RT_DAC_CMD_GET_RESOLUTION, &convertBits))
82     {
83         rt_kprintf("dac sample can't read resolution!\n");
84         return -RT_ERROR;
85     }
86     convertBits = (1 << (rt_uint8_t)convertBits);
87     for (channel = 1; channel < 3; channel++)
88     {
89         /* 打开通道 */
90         ret = rt_dac_enable(dac_dev, channel);
91         /* 设置输出值 */
92         if (argc >= 3)
93         {
94             value = atoi(argv[2]);
95             if (value > DAC_MAX_OUTPUT_VALUE)
96             {
97                 rt_kprintf("invalid dac value!!! \n");
98                 return -RT_ERROR;
99             }
100         }
101         rt_dac_write(dac_dev, channel, value);
102         rt_kprintf("%s CH%d Value is :%d \n", dac_device_name, channel, value);
103         /* 转换为对应电压值 */
104         vol = value * REFER_VOLTAGE / convertBits;
105         rt_kprintf("%s CH%d Voltage is :%d.%02dV \n", dac_device_name, channel, vol / 100, vol % 100);
106     }
107 
108     return ret;
109 }
110 /* 导出到 msh 命令列表中 */
111 MSH_CMD_EXPORT(dac_vol_sample, dac voltage convert sample < dac1 | dac2  value >);
112 #endif
113