打印
[KungFu8位 MCU]

[终于可以]KF8A 车规系列芯片 串口做LIN 波特率自适应(利用定时器去做误差修正)

[复制链接]
1458|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvben5d|  楼主 | 2023-1-5 08:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lvben5d 于 2023-2-26 18:31 编辑

首先主频16M 不要去降频应用  毕竟指令是4个时钟周期执行1个,很多都是双周期指令呢。且计算波特率的时候 在分子哟。  分频因子 选高速模式下 m =4  这样 16 000 000/4 = 4000 000   /19200  =》 208 = (EUBRGL1 +1)
             寄存器值EUBRGL1
18348 ==  217   -4.43%
18518 ==  216   -3.99%
18518 ==  215   -3.55%
18604 ==  214   -3.1%             29.0
18691 ==  213   -2.65%           24.8
18779 ==  212   -2.19%           20.5   
18867 ==  211   -1.73%           16.2                        
18957 ==  210   -1.26%           11.8
19047 ==  209   -0.79%            7.4
19138 ==  208   - 0.32%            3
19200 ==             0%
19230 ==  207   +0.15%         
19323 ==  206   +0.64%
19417 ==  205   +1.13%


理论19200 9bit    是937次计数值 (我是0.5us计数一次)
if(Checksum > 937)         
{  //说明此时晶振比16M主频 要快一点  计数数值才大于937    所以定时器的数值在19200波特率下 Tbit大于52us
      differ = Checksum - 937;
      if(differ < 2)         //0 1
      {
            EUBRGL1 = 207;
      }
      if(differ < 6)           //3 4 5                  -0.32%以内误差
      {
            EUBRGL1 = 208;
      }
      else if(differ < 10)   //6 7 8 9               -0.79%以内误差
      {
            EUBRGL1 = 209;
      }
      else if(differ < 14)  //10 11 12 13          -1.26%以内误差
      {
            EUBRGL1 = 210;
      }
      else if(differ < 19)  // 14 15 16 17 18     -1.73%以内误差
      {
            EUBRGL1 = 211;
      }
     else if(differ < 23)  //19 20 21 22          -2.19%以内误差
      {
            EUBRGL1 = 212;
      }
    else if(differ < 27)  //23 24 25  26         -2.65%以内误差
      {
            EUBRGL1 = 213;
      }
      else if(differ < 32) // 27 28 29 30 31    3.1%以内误差
      {
            EUBRGL1 = 214;
      }
     else if(differ < 34)  //3.55%以内误差
      {
            EUBRGL1 = 215;
      }
     else if(differ < 38)  //3.99%以内误差
      {
            EUBRGL1 = 216;
      }
     else if(differ < 42)  //4.43%以内误差
      {
            EUBRGL1 = 217;
      }
}
else {
     differ = 937 - Checksum ;
     if(differ < 4)   
     {

     }
}
备注:不要用官网PDF手册的办法走不通(测试过误差太大), 我是利用break帧中断 检测到break帧之后,开定时器检测0x55的5个上升沿来推算晶振误差!并进行误差修正




使用特权

评论回复
沙发
chenjun89| | 2023-1-6 08:22 | 只看该作者
波特率自适应就是代码干的事

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

746

帖子

12

粉丝