使用内部RC的导致串口通讯错误率高甚至失败的原因及解决办法

该文讨论了使用AVR单片机内部RC振荡器8MHz时钟进行上位机通讯出现的波特率误差问题。由于RC振荡器精度不足,导致波特率计算误差,进而影响数据传输的准确性。解决方法包括:采用外部晶振,对内部RC进行校准,选择能够得到整数波特率寄存器值的非标准波特率,以及通过上位机动态调整波特率来适应温度变化。实践证明,这些方法能有效改善通讯质量。
摘要由CSDN通过智能技术生成

以下以AVR单片机为例,使用内部RC振荡器8MHz系统时钟频率,上位机与单片机通讯出现问题:

首先分析原因:

1. 出于成本考虑没有使用外部晶振而是RC内部振荡器,精度较差,误差范围是标称值的±3%,而且系统振荡频率随温度的不同也会有一定的变化,因此根据标称的系统时钟频率来计算波特率就会产生相应的误差。

2. 当设置系统时钟为8MHz时,波特率一般都是习惯性的设置为9600、19200,115200等300的倍数,计算结果会有一定的误差。

例如波特率设置为9600,根据计算公式:

UBRRL=(FOSC/BAUD1/16-1)%256;

UBRRH=(FOSC/BAUD1/16-1)/256;

经计算得到的波特率寄存器初值UBRRH=0,UBRRL=51(实际值为51.083),就有一定的误差。用51反推波特率的数值为9615,误差率为0.16%,虽然不是很大,但是如果数据连续发送量较大则会有累计误差导致错码。

解决办法:

1. 能使用外部晶振当然是最好的解决办法。

2. 在使用内部RC振荡器的情况下:

1)使用官方给的方法对内部RC进行校准。

2)波特率的设置不一定要设置为9600等常用数值,而是针对8MHz计算能得到波特率寄存器数值为整数,这样就不存在取整导致的误差。

例如将波特率设置为10000,计算所得UBRRH=0,UBRRL=49,波特率寄存器的值刚好是整数,避免了取整误差。

上位机波特率也调整为10000,

3)避免一次发送大量数据,避免累计误差。

4)上位机可以用查询的方式来确定当前温度适用的波特率,例如可以设定9600±200Hz范围,每50Hz为一个步进给下位机发送一个多字节信号,并且发送多次,以是否每次都能收到下位机正常反馈信号为判断依据来决定当前的上位机波特率。

本人在使用方法2)和3)就使得问题有了明显改善。波特率调整到20000也能正常通讯,调整到50000失败。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值