Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ADC
触摸屏
nuc980
NK-980IOT测评之ADC接口触摸屏测试
发布于 2022-03-16 10:41:53 浏览:897
订阅该版
[tocm] # 特征 - 一个ADC,12位精度,逐次逼近型 - 9路单端输入 - 微分误差非线性误差DNL: +/-1.5 LSB;积分非线性误差 INL: +/-3 LSB - 采样率200kSPS - 轨到轨 VREF ~ AGND测量 - 模拟电压2.7-3.6V,数字电压1.2V - 自动掉电 - 低功耗2170uW (at 200k SPS), < 1uA ![image.png](https://oss-club.rt-thread.org/uploads/20220316/91ffc57d43895e7c9dce5c82747cc640.png.webp) # 配置 - 时钟源 ADC_S (CLK_DIVCTL7[20:19]) - 分频 ADC_N (CLK_DIVCTL7[31:24]) - 使能外设时钟 ADCCKEN (CLK_PCLKEN1[24]). - 复位外设控制器 ADCRST(SYS_APBIPRST1[24]) 写1复位,写0结束复位。 - 引脚配置 ![image.png](https://oss-club.rt-thread.org/uploads/20220316/67e3a2faaaaa386f02846bde4454968a.png.webp) # 功能 ## 量化 1LSB=VREF/4096 ## 通道选择 ![image.png](https://oss-club.rt-thread.org/uploads/20220316/b84ce698ee9cb48848718dd5dd762f7f.png.webp) ## 采样 采样必须满足如下条件 从下可以看出,如果Rsrc大,也就是驱动电流小,则fclk要小,也就是采样时间要长,也就是需要的充电时间要长。 ![image.png](https://oss-club.rt-thread.org/uploads/20220316/e9ca333c55e68c4cce95d48bb7d25a31.png.webp) 200ks/s时,典型值如下: ![image.png](https://oss-club.rt-thread.org/uploads/20220316/b682726d23ee06f9fdd57bd7574faab3.png.webp) ## 参考电压选择 ![image.png](https://oss-club.rt-thread.org/uploads/20220316/bbf65da65b3fcc68c6b4331838be4a60.png.webp) ## 时序 ![image.png](https://oss-club.rt-thread.org/uploads/20220316/481803449f6f26267898f0bbfd999f51.png.webp) 其中REFCNT (ADC_CONF[19:16]) 设置Wait阶段的额外等待参考电压稳定时间。 SAMPCNT (ADC_CONF[19:16]) 设置额外的采样和保持时间。 # 寄存器 - ADC_CTL 控制启动,上电,使能模块 - ADC_CONF 设置采样次数,等待参考电压稳定的时间REFCNT , 通道选择,参考电压选择,正常转化使能 NAC_EN (ADC_CONF[2]) 置位启动转换。 - ADC_IER 中断使能 - ADC_ISR 转换状态 - ADC_DATA 转换结果 # 硬件资源 ## 引脚 PB0 AIN[0] MFP8 PB2 AIN[2] MFP8 PB4 AIN[4] MFP8 PB6 AIN[6] MFP8 ![image.png](https://oss-club.rt-thread.org/uploads/20220316/24a5c28280be4963f0f1df16b2f4e8ef.png.webp) ## 四线电阻屏采样原理 上述四个ADC引脚实际是用来作为四线电阻屏采样使用的。 四线电阻屏的等效示意如下: ![image.png](https://oss-club.rt-thread.org/uploads/20220316/e1159f49a6f9c51d06177bd591a34b94.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220316/de42d94b6903583df100e789baf3fb7a.png) GND:推挽输出低 VCC:推挽输出高 Hi-Z:无上下拉,输入 ADC:模拟输入 # 代码编写 ``` void lcd_touch_init(void) { /* 1.时钟配置使能 */ /* 使能外设时钟 寄存器有保护 所以调用库函数 */ //M32(REG_CLK_PCLKEN1) |= 1u<<24; /* Enable ADC engine clock */ nu_sys_ipclk_enable(ADCCKEN); /* 2.复位模块 */ /* 复位模块 寄存器有保护 所以调用库函数 */ //M32(REG_SYS_APBIPRST1)|= 1u<<24; //M32(REG_SYS_APBIPRST1)&= ~(1u<<24); /* Reset the ADC IP */ nu_sys_ip_reset(ADCRST); /*选择时钟源 bit[20:19] 00 = ADC_SrcCLK is from XIN. 01 = Reserved. 10 = ADC_SrcCLK is from APLLFOut. 11 = ADC_SrcCLK is from UPLLFOut. */ M32(REG_CLK_DIVCTL7) = (M32(REG_CLK_DIVCTL7) & (~(3u<<19))) | (0u<<19); /* 选择外部12M ADC_S=0 */ /*bit[31:24] ADC_CLK = ADC_SrcCLK / (ADC_N + 1). */ M32(REG_CLK_DIVCTL7) = (M32(REG_CLK_DIVCTL7) & (~(0xFFu<<24))) | (2u<<24); /* ADC_N=2 3分频 4M */ /* 配置ADC */ M32(REG_ADC_CTL) |= 1u<<0; /* Power on ADC. */ M32(REG_ADC_CTL) |= 1u<<1; /* Power on internal bandgap. */ M32(REG_ADC_CONF) = (M32(REG_ADC_CONF) & (~(0xFFu<<24))) | (64<<24); /* SAMPCNT = 64 */ M32(REG_ADC_CONF) = (M32(REG_ADC_CONF) & (~(0x0F<<16))) | (1u<<16); /* REFCNT = 1 2 等待电源稳定2^REFCNT各时钟*/ M32(REG_ADC_CONF) = (M32(REG_ADC_CONF) & (~(0x03<<6))) | (3u<<6); /* 参考电压选择 11 = AGND33 vs AVDD33. 00 = AGND33 vs VREF input.*/ M32(REG_ADC_CONF) |= 1u<<2; /* 使能转换 */ } uint16_t lcd_touch_getx(void) { /* 1.引脚配置 */ /* PB0推挽输出低 */ rt_pin_mode(NU_GET_PININDEX(NU_PB, 0), PIN_MODE_OUTPUT); rt_pin_write(NU_GET_PININDEX(NU_PB, 0), PIN_LOW); /* PB2推挽输出高 */ rt_pin_mode(NU_GET_PININDEX(NU_PB, 2), PIN_MODE_OUTPUT); rt_pin_write(NU_GET_PININDEX(NU_PB, 2), PIN_HIGH); /* PB4输入 无上下拉 关闭输入 */ rt_pin_mode(NU_GET_PININDEX(NU_PB, 4), PIN_MODE_INPUT); //GPIO_DISABLE_DIGITAL_PATH(GPIOB,1<<4); /* PB6输入 无上下拉 关闭输入 ADC*/ rt_pin_mode(NU_GET_PININDEX(NU_PB, 6), PIN_MODE_INPUT); //GPIO_DISABLE_DIGITAL_PATH(GPIOB,1<<6); M32(REG_SYS_GPB_MFPL) = (M32(REG_SYS_GPB_MFPL) & 0xF0FFFFFF) | 0x08000000; /*PB6 MFP8 */ M32(REG_ADC_CONF) = (M32(REG_ADC_CONF) & (~(0x0F<<12))) | (6u<<12); /* 选择通道6 */ M32(REG_ADC_ISR) |= (1u<<10) | (1u<<0); /* 写1清标志 */ M32(REG_ADC_CTL) |= 1u<<8; /* 启动转换 */ while((M32(REG_ADC_ISR) & (1u<<10)) == 0); /*等待转换完 */ M32(REG_ADC_ISR) = M32(REG_ADC_ISR); /* 写1清标志 */ M32(REG_SYS_GPB_MFPL) = (M32(REG_SYS_GPB_MFPL) & 0xF0FFFFFF) | 0x00000000; /*PB6 MFP0 恢复为IO模式*/ return M32(REG_ADC_DATA); } uint16_t lcd_touch_gety(void) { /* 1.引脚配置 */ /* PB4推挽输出低 */ rt_pin_mode(NU_GET_PININDEX(NU_PB, 4), PIN_MODE_OUTPUT); rt_pin_write(NU_GET_PININDEX(NU_PB, 4), PIN_LOW); /* PB6推挽输出高 */ rt_pin_mode(NU_GET_PININDEX(NU_PB, 6), PIN_MODE_OUTPUT); rt_pin_write(NU_GET_PININDEX(NU_PB, 6), PIN_HIGH); rt_thread_mdelay(100); rt_pin_write(NU_GET_PININDEX(NU_PB, 6), PIN_LOW); rt_thread_mdelay(100); /* PB0输入 无上下拉 关闭输入 */ rt_pin_mode(NU_GET_PININDEX(NU_PB, 0), PIN_MODE_INPUT); //GPIO_DISABLE_DIGITAL_PATH(GPIOB,1<<0); /* PB2输入 无上下拉 关闭输入 ADC*/ rt_pin_mode(NU_GET_PININDEX(NU_PB, 2), PIN_MODE_INPUT); //GPIO_DISABLE_DIGITAL_PATH(GPIOB,1<<2); M32(REG_SYS_GPB_MFPL) = (M32(REG_SYS_GPB_MFPL) & 0xFFFFF0FF) | 0x00000800; /*PB2 MFP8 */ M32(REG_ADC_CONF) = (M32(REG_ADC_CONF) & (~(0x0F<<12))) | (2u<<12); /* 选择通道2 */ M32(REG_ADC_ISR) |= (1u<<10) | (1u<<0); /* 写1清标志 */ M32(REG_ADC_CTL) |= 1u<<8; /* 启动转换 */ while((M32(REG_ADC_ISR) & (1u<<10)) == 0); /*等待转换完 */ M32(REG_ADC_ISR) = M32(REG_ADC_ISR); /* 写1清标志 */ M32(REG_SYS_GPB_MFPL) = (M32(REG_SYS_GPB_MFPL) & 0xFFFFF0FF) | 0x00000000; /*PB2 MFP0 恢复为IO模式*/ return M32(REG_ADC_DATA); } main主循环中 #if TOUCH_TEST uint16_t x = lcd_touch_getx(); uint16_t y = lcd_touch_gety(); rt_kprintf("/*%d,%d*/\r\n",x,y); rt_thread_mdelay(50); #endif ``` # 源码 https://gitee.com/qinyunti/nk-980-iot-test.git # 测试 使用serial studio可视化采集到的ADC数据 从屏幕上匀速划过,可以看到X Y轴会线性变化 ![image.png](https://oss-club.rt-thread.org/uploads/20220316/a202e3062ddde9e9edfe2f505abb9977.png.webp) # 总结 完成触摸屏ADC的采集后,后面就是优化采集精度和校准算法。 后面再移植到GUI支持触摸。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
请大神帮忙看下风格 还是哪里有问题 照着串口驱动写的ADC驱动
2
ADC config
3
rt_thread_delay()和ADC采样之间的冲突
4
请教在官方BSP中的STM32F40X程序中加入ADC,串口没输出。
5
给RT-Thread添加ADC驱动框架
6
求助:ADC采样被干扰
7
【内核和外设学习营】十里 ADC光敏电阻电压采集实验
8
<内核学习营>+坦然+探索者stm32f407板子的ADC测试光传感器实验
9
【内核学习营】+青春+ADC读取光敏传感器实验
10
《内核学习营》+水一方+项目中应用的ADC实现电压采集
推荐文章
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在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部