Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ADC设备
M2354
【NuMaker-M2354试用】ADC测试分享
发布于 2021-12-04 20:33:35 浏览:1068
订阅该版
#1、工程创建 从gitee上下载rtthread完整版gitee-master分支(注意分支一定要选对)。[rtthread完整版](https://gitee.com/rtthread/rt-thread.git) ![1.png](https://oss-club.rt-thread.org/uploads/20211204/527237f8b48f482fc923dd57bc056994.png) 等待下载完成。 然后删除BSP文件夹下的板级支持包,仅留下nuvoton,并且将nuvoton文件夹下除了libraries和numaker-m2354其它都删除了,再然后将libraries下除了m2354和nu_packages以外的都删了。再然后回到numaker-m2354文件夹开始使用ENV工具。这里参照[官网文档](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/quick-start/numaker-m2354/quick-start)进行操作就可以了。或者你可以不了解,直接按照下述指令一条一条输入: `menuconfig --generate` `pkgs --update` `scons --target=mdk5`(MDK5用户)或者`scons --target=IAR`(IAR用户) 我这里使用的是MDK5。 ![6.png](https://oss-club.rt-thread.org/uploads/20211204/48dc8947197e887fe25e69ae5f94474b.png) ![7.png](https://oss-club.rt-thread.org/uploads/20211204/61dd8e3514b3e82a8e2d5864df247490.png) 最后出现上述图片的内容就成功了。 #2、工程裁剪 使用ENV工具,输入指令menuconfig,弹出如下界面。 ![5.png](https://oss-club.rt-thread.org/uploads/20211204/d6ac93c002034091ce79cc37ea624651.png) 这里不一一贴图了,高级功能都关了就可以。我工程中仅开启了串口(finsh)、ADC和ECAP功能(我的任务是EADC和ECAP)。 ![8.png](https://oss-club.rt-thread.org/uploads/20211204/15261645eb01809915b5fd28bc1f56b5.png) #3、ADC底层代码 官方已经很贴心的实现了ADC的驱动层,drv_eadc.c,可实现ADC0的16个通道可选开起及关闭以及AD值读取功能。可以说是十分的贴心😏。 ```c /* nu_adc_enabled - Enable ADC clock and wait for ready */ static rt_err_t nu_eadc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) { EADC_T *eadc_base = ((nu_eadc_t)device)->eadc_base; int *peadc_reg_tab = &((nu_eadc_t)device)->eadc_reg_tab; RT_ASSERT(device != RT_NULL); if (channel >= ((nu_eadc_t)device)->eadc_max_ch_num) return -(RT_EINVAL); if (enabled) { if (*peadc_reg_tab == 0) { EADC_Open(eadc_base, EADC_CTL_DIFFEN_SINGLE_END); } *peadc_reg_tab |= (0x1 << channel); } else { *peadc_reg_tab &= ~(0x1 << channel); if (*peadc_reg_tab == 0) { EADC_Close(eadc_base); } } return RT_EOK; } static rt_err_t nu_get_eadc_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value) { RT_ASSERT(device != RT_NULL); RT_ASSERT(value != RT_NULL); EADC_T *eadc_base = ((nu_eadc_t)device)->eadc_base; int *peadc_reg_tab = &((nu_eadc_t)device)->eadc_reg_tab; if (channel >= ((nu_eadc_t)device)->eadc_max_ch_num) { *value = 0xFFFFFFFF; return -(RT_EINVAL); } if ((*peadc_reg_tab & (1 << channel)) == 0) { *value = 0xFFFFFFFF; return -(RT_EBUSY); } EADC_ConfigSampleModule(eadc_base, 0, EADC_SOFTWARE_TRIGGER, channel); EADC_CLR_INT_FLAG(eadc_base, EADC_STATUS2_ADIF0_Msk); EADC_ENABLE_INT(eadc_base, BIT0); EADC_ENABLE_SAMPLE_MODULE_INT(eadc_base, 0, BIT0); EADC_START_CONV(eadc_base, BIT0); while (EADC_GET_INT_FLAG(eadc_base, BIT0) == 0); *value = EADC_GET_CONV_DATA(eadc_base, 0); return RT_EOK; } ``` #4、ADC应用 使用官网提供的ADC测试代码,更改设备名称为eadc0,通道选择为6 ```c #include
#include
#define ADC_DEV_NAME "eadc0" /* ADC 设备名称 */ #define ADC_DEV_CHANNEL 6 /* ADC 通道 */ #define REFER_VOLTAGE 300 /* 参考电压 3.0V,数据精度乘以100保留2位小数*/ #define CONVERT_BITS (1 << 12) /* 转换位数为12位 */ static int adc_vol_sample(int argc, char *argv[]) { rt_adc_device_t adc_dev; rt_uint32_t value, vol; rt_err_t ret = RT_EOK; /* 查找设备 */ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); if (adc_dev == RT_NULL) { rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME); return RT_ERROR; } /* 使能设备 */ ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL); /* 读取采样值 */ value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); rt_kprintf("the value is :%d \n", value); /* 转换为对应电压值 */ vol = value * REFER_VOLTAGE / CONVERT_BITS; rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100); /* 关闭通道 */ ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL); return ret; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample); ``` #5、测试 在FINSH控制台下,查看设备,eadc0已经在列表中了。 ![9.png](https://oss-club.rt-thread.org/uploads/20211204/fc311b9a1843f6cb2f08d0b57a088f25.png) 什么都不接的情况下测试ADC读取,此时ADC值为306,按照比照电压3V计算,此时为0.22V。 ![10.png](https://oss-club.rt-thread.org/uploads/20211204/64bc9d28352bfe95083bffa41029fc43.png) 将ADC0_CH6与电源GND相连,此时ADC值为0。 ![11.png](https://oss-club.rt-thread.org/uploads/20211204/c6892dab4076d83d2296d024a28a0b36.png) 测试完成。官方已经将基本的ADC设备驱动、框架搭建好了,十分的人性化,本人能力有限,如果文章中存在问题,请大家多多指教。 #6、问题 [例程代码](https://gitee.com/werper/nu-maker-m2354_-test) 我这个代码可以在KEIL下进行仿真,运行无问题,但是,断开仿真,重新上电,板子就不启动,目前还没发现为什么,希望有大佬指点一下。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
werper
叫我点灯大师
文章
9
回答
17
被采纳
1
关注TA
发私信
相关文章
1
adc设备不能打开。。。。。
2
ADC 设备名称是怎么确定的
3
stm32g0 设备驱动框架 wdt adc 报错
4
ADC设备只能采集一个通道值?
5
rtthread studio adc三通道采集ntc电阻出现问题
6
ADC复制的void HAL_ADC_MspInit编译错误
7
双通道ADC采集问题
8
多通道ADC读取出现问题
9
ADC 总线打不开 控制台没有ADC总线
10
rt_adc_voltage 使用问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
聚散无由
2
篇文章
12
次点赞
Wade
2
篇文章
2
次点赞
xiaorui
1
篇文章
1
次点赞
zhuzhuzhu
1
篇文章
1
次点赞
catcatbing
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部