打印
[STM32F1]

希望大神可以给一些启发~~~~

[复制链接]
2957|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aoty|  楼主 | 2014-1-11 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟愚钝,能否给小弟解决下这个。。。
现在我的驱动板上有四个电机,然后我用CAN发送数据,我想要实现的是先给每一个电机口都附上一个地址,然后再附上数据,这样就可以保证数据不会“走”错。。。。
或是一个数据一个+一个地址作为一组。。。。
我对CAN的认识还是很肤浅的,希望大神可以给我一点启发~~:):)
沙发
aoty|  楼主 | 2014-1-11 11:29 | 只看该作者
顶!!!

使用特权

评论回复
板凳
杨爱林林| | 2014-1-11 11:33 | 只看该作者
你是指 一个主控板 和 一个带有4个电机的驱动板 之间的can通讯吗

使用特权

评论回复
地板
aoty|  楼主 | 2014-1-11 11:43 | 只看该作者
杨爱林林 发表于 2014-1-11 11:33
你是指 一个主控板 和 一个带有4个电机的驱动板 之间的can通讯吗

  嗯!我指的是那个意思!
  但是不知道我的这个想法如何去实现!!!
  这个地址如何分配。。。分配后怎么和数据区对应?很头大~~~

使用特权

评论回复
5
airwill| | 2014-1-11 12:18 | 只看该作者
其实, 怎么分配, 和怎么区分, 完全由你自由安排.
1. 地址可以放在 CAN 的 ID 里. 这样不同的 ID 对应不同的电机.
2. 使用相同的 ID, 那么后面的报文里, 可以指定1个字节电机的地址, 后面若干字节跟电机的控制. 电机端的控制器去解析这个报文就是了.
3. 统一处理, 使用相同的 ID, 后面的报文里8个字节分成四个块, 每个块对应一个电机的控制命令. 这种方式的报文量最少, 效率可以达到最高.

使用特权

评论回复
6
ahuzjh| | 2014-1-11 14:17 | 只看该作者
过来看看,顺便学习一下CAN的知识。

使用特权

评论回复
7
aoty|  楼主 | 2014-1-11 15:12 | 只看该作者
airwill 发表于 2014-1-11 12:18
其实, 怎么分配, 和怎么区分, 完全由你自由安排.
1. 地址可以放在 CAN 的 ID 里. 这样不同的 ID 对应不同的 ...

对于你说的第三点的理解。。。
是不是说我从左往右4个块对应四个电机。。。这样就不用附地址,直接将数据给到电机口就行!!!
还是说命令一个字节,数据一个字节?
嘿嘿,还有就是你说的那个报文量很少我不太懂!
给解释下吧!!!麻烦了~~~

使用特权

评论回复
8
airwill| | 2014-1-11 16:04 | 只看该作者
一个报文含四组电机, 广播式发送, 每个电机去取报文里相应的值.

使用特权

评论回复
9
aoty|  楼主 | 2014-1-11 17:10 | 只看该作者
airwill 发表于 2014-1-11 16:04
一个报文含四组电机, 广播式发送, 每个电机去取报文里相应的值.

:dizzy:     
广播式发送不就是一般的发送么?只是一次发送的数据为8个么?

使用特权

评论回复
10
拿起书本| | 2014-1-11 18:34 | 只看该作者
最近在多机通信的问题上遇到问题,进来学习学习。

使用特权

评论回复
11
airwill| | 2014-1-11 19:59 | 只看该作者
因为 CAN 的最长报文中数据是 8个字节

使用特权

评论回复
12
aoty|  楼主 | 2014-1-16 00:01 | 只看该作者
airwill 发表于 2014-1-11 19:59
因为 CAN 的最长报文中数据是 8个字节

C:\Documents and Settings\Administrator\桌面
这是我的思路,你看看对么?

使用特权

评论回复
13
airwill| | 2014-1-16 08:54 | 只看该作者
看不到你的思路,  我觉得已经说得蛮清楚了.
比较简单, 3种方式都可以考虑.

使用特权

评论回复
14
feilusia| | 2014-1-18 11:11 | 只看该作者
这个简单,我有两个思路。
一、一次性发送四个电机的数据:
数据格式为:数据长度+电机1数据+电机2数据+电机3数据+电机4数据+校验和。
(如果总长度超过CAN一次能发送的数据,可以再添加一个字节用作这是第几帧数据)


二、分别发送四个电机的数据:
数据格式为:
数据长度+0x01+电机1数据+校验和;
数据长度+0x02+电机2数据+校验和;
数据长度+0x03+电机3数据+校验和;
数据长度+0x04+电机4数据+校验和;
(根据一个字节代表电机号来判断是哪台电机)

使用特权

评论回复
15
aoty|  楼主 | 2014-1-18 15:29 | 只看该作者
feilusia 发表于 2014-1-18 11:11
这个简单,我有两个思路。
一、一次性发送四个电机的数据:
数据格式为:数据长度+电机1数据+电机2数据+电 ...

的确比较笨,还是有些不理解你说的这种。。。下面是我的按键一的程序,
        if(RxMessage.Data[2]==0x1010)  //按键1       
        {
                A=0x01;         //电机1地址
                B=0x55;         //电机1数据
        }       
我的这个没有你说的那些    数据长度  和  校验和;
不知道我写的这个行么?
还有就是因为我控制的是电机,所以B应该是占空比,但这个一般不应该是几千的数值?这样的话,B的数据类型怎么定义或是怎么处理?

使用特权

评论回复
16
aoty|  楼主 | 2014-1-18 15:32 | 只看该作者
aoty 发表于 2014-1-18 15:29
的确比较笨,还是有些不理解你说的这种。。。下面是我的按键一的程序,
        if(RxMessage.Data[2]==0x1010)  ...

这是一块的问题,顺便问一下吧~
https://bbs.21ic.com/icview-675446-1-1.html
谢谢~麻烦了~:)

使用特权

评论回复
17
aoty|  楼主 | 2014-1-18 15:36 | 只看该作者
feilusia 发表于 2014-1-18 11:11
这个简单,我有两个思路。
一、一次性发送四个电机的数据:
数据格式为:数据长度+电机1数据+电机2数据+电 ...

这是一块的问题,顺便问一下吧~
https://bbs.21ic.com/icview-675446-1-1.html
谢谢~麻烦了~:)

使用特权

评论回复
18
feilusia| | 2014-1-18 17:18 | 只看该作者
aoty 发表于 2014-1-18 15:29
的确比较笨,还是有些不理解你说的这种。。。下面是我的按键一的程序,
        if(RxMessage.Data[2]==0x1010)  ...

你把这几个模块搞混了。
你的程序里有三个模块:按键、CAN、电机。
按键模块得到数据。
CAN模块传输数据。
电机模块处理数据。
每个模块只做自己的事情,不做其他模块的事。

你这段程序就是按键得到了两个电机要用的数据,随后就是通过CAN发送。

CAN发送过程中有很多数据,总的来说就是硬件协议数据+要发送的数据,硬件协议部分不需要你去管,硬件会帮你做掉,你只要把你要发送的数据写给寄存器,然后发送就行。

如果你只把01+55当做“要发送的数据”发送过去当然可行,因为这里你只有控制电机。但是如果通过CAN发送的数据类型包括LCD、模拟量、电机等模块的数据。那你仅仅把01+55发送过去是不够的,这时候就要将数据打包后再加一层CAN自己的数据协议。
例如:
数据长度+0x01(电机模块)+电机数据+校验和
数据长度+0x02(LCD模块)+LCD数据+校验和
接收端的CAN将这一串数据解析,提取出有用的数据(比如其中的电机数据)交给相应的模块。

使用特权

评论回复
19
aoty|  楼主 | 2014-1-18 19:18 | 只看该作者
feilusia 发表于 2014-1-18 17:18
你把这几个模块搞混了。
你的程序里有三个模块:按键、CAN、电机。
按键模块得到数据。

对不起,这个怪我表述不清。。。
我贴出来程序写的  按键1  是代表按键1按下的时候,主控板判断来的数据是不是0x1001(这个数据我在手柄哪一块处理的),若是这将数据A B发送给电机。。。但是我实在是太笨了,我猜测你写的 数据长度 和 校验和 是不是用于两个CAN发送,或许是说这样:
if(RxMessage.Data[2]==0x1010)  //按键1        
        {
                DLC=5;
                A=0x01;         //电机1地址
                B=0x55;         //电机1数据
                //但是那个校验和怎么加?
        }   
呵呵~对不起了~你讲的很好~很受用~谢谢~

使用特权

评论回复
20
feilusia| | 2014-1-18 20:29 | 只看该作者
aoty 发表于 2014-1-18 19:18
对不起,这个怪我表述不清。。。
我贴出来程序写的  按键1  是代表按键1按下的时候,主控板判断来的数据 ...

整个流程大概是这样,举实际例子:
发送方:
(1)按键模块分为三个部分:键值采集、键值判断、键值处理。
你的程序中判断如果键值为1,则赋值A=0x01、B=0x55.
这实际上是“键值判断+键值处理”一起做了(你这么写程序会发现自己写程序容易,跟人合作难),最好养成分开写的习惯。
(2)CAN发送:在需要发送数据的时候调用CAN的发送函数,将这两个数据进行打包处理后发送出去。
我一般把数据打包成这样:数据长度+功能码+数据+校验和。
比如:0x05(5个数据)+0x01(电机模块的数据)+0x01(电机1地址)+0x55(电机1数据)+0x0x5c(前面所有数据相加的校验和)。
接收方:
(1)CAN接收:
①数据接收:将整串数据接收下来,退出中断。
②数据判断:
通过第一个字节的数据长度找到校验和。
本机计算一遍校验和与收到的校验和比较,判断数据正确性。
数据正确,则判断第二字节的功能码为电机功能码0x01。
③数据处理:
将数据(0x01+0x55)交给电机模块。
(2)电机模块:判断A=0X01后,则根据0x55对电机1进行相应操作。




使用特权

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

本版积分规则

个人签名:很高兴注册21IC

31

主题

207

帖子

1

粉丝