注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
Tobey的个人空间 https://home.eeworld.com.cn/space-uid-719346.html [收藏] [复制] [分享] [RSS]
日志

ADC值不稳定问题

已有 5662 次阅读2016-10-8 21:15 |个人分类:硬件开发_嵌入式编程| keil, ADS1248, SPI, 频率


/******2016.8.20***********/
开发环境:
开发工具:keil V5.20,
硬件设备:STM32F103C8T6
问题描述:
1、为了实现温控系统,基于ADS1248芯片编写了ADC模块,在裸奔情况下运行正常,
于是,将其移植到RTX下,紧接着发现在串口助手中显示的ADC数值不稳定,波动
剧烈,正确的ADC数据间断出现,,,
2、于是在调试窗口反复复位进行调试发现:
程序启动后第一次显示的ADC值若是正确的,则之后获取到的ADC值不发生
波动,数值正确。反之,若第一次获取到的数值为错误的,那么之后获取
到的数值均为错误值,
3、出于上述现象,我把出错位置定位在ADS1248初始化上,由于ADS1248初始化时
在复位及校准时需要延迟一段时间,于是我把该延迟时间修改了(改小了),
接着发现,,AD数值显示变得稳定了~~
当然,上述做法纯属胡乱修改~~
4、于是我就在裸奔程序的基础上进行了测试:
首先,我将裸奔程序的延迟时间爱你依次扩大了2、4、6、10倍进行测试,结果发现
ADC值均能正常输出,
接着,参照RTX项目中的配置,将裸奔程序中的SPI2的时钟频率扩大了一倍进行测试,
结果ADC值出现波动~~
5、在网上搜索相关资料是看到有网友指出错误可能并不是出在ADC上,而是出在SPI
上,于是,将RTX项目中的SPI时钟频率缩小一倍,结果ADC输出值正确,紧接着,
将延迟时间延长,ADC输出值依然正确,,,
6、翻阅ADS1248手册,查看相关时序图,发现手册中对于SCLK的周期要求是至少
488ns,也就是说SPI的频率最大不能超过2MHz,然而,即使APB1外设时钟频率为
36MHz,SPI2经过分频后的频率也只有140KHz,并没有超过限定值!
7、好吧,,重点的是结果~~我并没有找到该问题的产生原因,,,
有相关经验并找到原因的大侠们,请给我留言,谢谢!
小插曲:
为了验证SPI2的频率,使用滤波器对SCLK引脚进行了测量,发现当SPI2的频率为
70KHz时,示波器中显示的波形正常,当SPI2的频率为140KHz是,示波器中显示
的波形出现尖峰,也就是说:此时的SCLK的脉冲不满足tSPWL的要求,因此,
无法正确获取AD值,,然而正在这是电脑蓝屏了(串口造成的),于是强制关机
重启,将程序rebuild一遍,使用示波器对各引脚再次进行测量(36KHz),发现
SCLK的波形显示正常了~~~再看串口助手中的数据,ADC值也稳定了~~

事后发现ADC值仍然时不时的波动,,于是还是将频率缩小了一倍,,,
问题出处:
对照了裸奔程序后,发现两者唯一的区别仅在于SPI的速率,在裸奔情况下,SPI2
的时钟频率为:18MHz,预分频:256 --》 波特率70KBits,在RTX中,SPI2的时钟
频率为:36MHz,预分频:256 --》 波特率140KBits;
解决方法:
将RTX中的SPI2的时钟频率修改为:18MHz,这时,所有的数据显示都正常了,,




评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章