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