问题出现的背景
需要写一个新的电机的驱动,使用can通讯,驱动比较简单,很快就写好了。自己单独测试一个电机的时候没有问题,正反转测什么的都很正常。本以为事情会很顺利,但是在测两个电机的时候,却发现很严重的问题,经常左电机不装或者是右电机不转。
问题的解决步骤
方案一:
1. 遇到这种问题通常都是加上一个延时,觉得可能就是发的太快了,时许上可能有问题,但是我们的系统是一个实时的系统延时的时间不能太长。
2. 经过测试发现加延时可能较小出现这种问题的概率,但是不能解决这个问题,最终车子还是无法正常运行,没办法这个方案不行。
分析:
既然加延时不行的话,只能去找为什么电机不装。使用can转usb将数据抓出来之后,发现电机不转是由于,有帧丢失。每个电机发数据需要2帧数据,两个电机也就是4帧数据。但是只能抓到3帧数据。丢失了一帧数据。那么这个可能是由于can的发送邮箱不够,导致的丢帧
背景知识:
发送
3 个发送邮箱
发送报文的优先级特性可软件配置
记录发送 SOF 时刻的时间戳
接收
3 级深度的2个接收 FIFO
14 个位宽可变的过滤器组 - 由整个 CAN 共享
标识符列表
FIFO 溢出处理方式可配置
记录接收 SOF 时刻的时间戳
因此接下来,我分析就是要检查can邮箱空闲的的寄存器个数,看是否是因为连续发送4帧数据的时候,can空闲的邮箱不够用了。
因此我在每次发送之前,检查这个寄存器的26,27,28位,统计可使用的邮箱个数。
方案二:
发送之前统计可使用的邮箱个数,只有在有邮箱的时候,我们才会发送新的数据。
结果:
结果出乎意料,每次发送的时候显示的邮箱个数,都是3个,也就是说根本就没有出现邮箱不够用的情况 。方案二不可行。
继续分析:
发现跑的时候,这个位经常会被置1,不是因为邮箱不够丢失数据,而是由于仲裁丢失数据。
进一步验证:
发现这个寄存器每次回复的都是邮箱0,因此跟家判断不是邮箱不够的问题。每50ms发4帧数据是完全够用的。
方案三:
因为发送数据的id,比从机回复的id要大因此,发送时可能会因为,id较大,同时抢占can的时候会导致数据帧仲裁丢失。
因此开启can的自动重发功能。
使用hal库的话也就是一句话:
g_sCAN_Handler[dwDevice].Init.NART = DISABLE;//开启自动重发
结果问题,完美解决
关键字:stm32 调试 can总线 丢帧
引用地址:
stm32 调试can总线丢帧的问题
推荐阅读最新更新时间:2024-03-16 16:25
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
1.原理: 通过定时器每隔一段时间触发一次DAC转换,然后通过DMA发送正玄波码表值给DAC. 当需要改变频率HZ时,只需要修改定时器频率即可(最高只能达到20KHz) 当需要改变正玄波的正峰峰值/负峰峰值时,只需要修改正玄波码表即可 2.实现 代码如下所示(采用的是定时器2,DAC引脚是PA4) #define HZ(x) (u16)(72000000/sizeof(Sine12bit)*2/x) //计算Hz #define DAC_DHR12R1 0x40007408 //外设DAC通道1的基地址 u16 Sine12bit = { //正弦波描点 2048, 2098, 2148, 2
[单片机]
详解STM32启动文件
本文对STM32启动文件startup_stm32f10x_hd.s的代码进行讲解,此文件的代码在任何一个STM32F10x工程中都可以找到。可以点击文末阅读原文直接下载此文件,提取码stm3。 启动文件使用的ARM汇编指令汇总 Stack——栈 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN= Stack_Mem SPACE Stack_Size __initial_sp 开辟栈的大小为 0X00000400(1KB),名字为 STACK, NOINIT 即不初始化,可读可写, 8(2^3)字节对齐。 栈的作用是用于局部变量,函数调用,函数形
[单片机]
再造STM32---第一部分:如何正规的安装KEIL5?
获取本文所有安装包和注册机方式: 1、CSDN下载: https://download.csdn.net/download/qq_38351824/10943718 2、可以关注点赞并在下方评论,我给你邮箱发过去。 3、关注微信公众号下载: ① 关注微信公众号:Tech云 ② 一、温馨提示: 1、 安装路径不能带中文,必须是英文路径 2、 安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突,三者目录必须分开 3、 KEIL5 的安装比起 KEIL4 多了一个步骤,必须添加 MCU 库,不然没法使用。 4、 如果使用的时候出现莫名其妙的错误,先百度查找解决方法,莫乱阵脚。 二、获取 KEIL5
[单片机]
基于STM32的EMS液晶显示触摸屏设计方案
电动车一直以清洁环保而备受关注,加上能源危机加剧、油价不断上涨,电动车也越来越受到用户的青睐。电动车一般采用锂电池供电,由多个单体电池串联成电池组作为动力电源。但由于各个串联单体电池特性不能保证完全一致,因此相同的电流下充电放电速度也会不同,如果不进行均衡干预,电池寿命会大大缩短,因此需要实时监控各个单体电池的状态、总电压、总电流,根据状态适时进行电池充放电均衡,并且充放电均衡时,均衡状态也要实时进行检测,所以就有了电动车电池能量管理系统(EMS)。实践证明EMS可以有效延长电动车电池使用寿命,是电动车中十分重要的管理系统。
EMS主要包括:信息采集模块、充放电均衡模块、信息集中处理模块以及显示模块。图1为自主研发的电
[电源管理]
STM32基础之IIC
IIC协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的, 由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 IIC总线特点 IIC总线最主要的优点是其简单性和有效性。 由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。 IIC总线的另一个优点是,它支持多主控(multimastering)。 其中任何能够进行发送和接收的设备都可以成为主总
[单片机]
STM32的GPIO输出编程实例之点亮三色LED
一、概述: 1、发光二极管简介 发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算: R = (E - UF)/IF 式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。 2、STM32 GPIO简介 GPIO可以配置成以下8种工作模式: 浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。 上拉输入:上拉输入模式与浮空输入模式相
[单片机]
STM32通用定时器的几个重要寄存器
1..自动装载寄存器部分实际上包含两个寄存器: 自动装载寄存器缓冲寄存器 和 自动装载寄存器影子寄存器 其中自动装载寄存器缓冲寄存器可以有ARPE位控制是否起作用: ARPE = 0 写 自动装载寄存器 时,数据直接写入到 自动装载寄存器缓冲寄存器 的同时,立即更新到 自动装载寄存器影子寄存器 ARPE = 1 写 自动装载寄存器 时,数据直接写入到 自动装载寄存器缓冲寄存器 的同时,只有更新事件发生的时候,才更新到 自动装载寄存器影子寄存器 2.预分频器控制寄存器也分为两部分: 预分频器缓冲寄存器 和 预分频器影子寄存器 当更新事件发生的时候, 预分频器缓冲寄存器 的内容更新到 预分频器影子寄存器中 3.UDIS位作用:
[单片机]
基于CAN总线的PLC/IPC印染设备控制系统
引言 CAN总线是现场总线的一种,最初用于汽车内部检测部件与执行部件之间的数据通讯,有极强的抗恶劣环境和抗干扰能力。由于本身的特点,其应用范围已经由交通运输扩展到过程控制、数控机床、机器人、智能建筑、医疗器械等领域,被公认是几种最有前途的现场总线之一。
与多数现场总线(如Profibus、CC-Link等)的物理层采用RS485主从协议不一样,CAN的介质访问采用载波侦听多路访问(CSMA)技术,从而允许多主工作方式。并且,由于采用非破坏性总线仲裁技术,大大节省了总线冲突仲裁时间。与多数现场总线不一样,CAN总线只有物理层和数据链路层,应用层留给用户开发,使用户拥有了相当的灵活性。这些优点令人注目,以致于一些颇有名气
[嵌入式]