|
这个实例的板子和程序均为个人兴趣所做,测试已经通过,但是难免有所问题,如有错误和能够完善的地方,希望和大家相互学习。
整体构思:这套小板是为了通过I/O口低电压系统(3.3V)隔离驱动高电压系统(24V),实现MCU对24V电压输出的有无控制,低电压系统对高电压系统的隔离驱动控制是通过光耦来实现的,MCU的I/O输出0V时,光耦导通,对应接口输出24V。
(实际测试时已经通过硬件结构使每个I/O口对应一个小灯,MCU的I/O输出0V时,对应接口输出24V,小灯点亮;MCU的I/O输出3.3V时,对应接口输出0V,小灯熄灭)。
硬件结构
板子分为主板和插板两种,主板主要负责通过stm32f103c8t进行I/O口高低电平的控制,插板主要负责把主板输出的I/O口电平通过光隔离来控制24V的输出。每一个插板可以最多驱动8路24V电压,每个底板最多插3个插板,所以一套完整的小板可以控制24个I/O口。
板子焊了1套完整版和1个单独的主板。单独的主板负责通过can总线进行发送命令,完整版的负责通过can总线进行接收并且处理,实现小灯的点亮和熄灭。
完成品展示
全套的:
软件部分
软件部分的编写主要是参考网络上的刘洋老师讲解的STM32开发板的视频中的讲解,但是为了节省成本,所以采用了stm32f103c8t(有1路CAN),芯片共48个引脚,选取了其中的24个作为普通I/O,下载方式采用SW下载方式,这种下载接口较少,只需TCK,TMS,GND三根线即可,大家可以百度“JLink三线下载器的制作”,有很多这方面的资料。我为了解决下载时的供电问题,在下载接口中多增加了一根VCC供电线。
由于ST公司提供了库函数,所以对于程序的编写相对来说就轻松了不少。但还是有一点点细节的部分,需要注意一下。
1. 关于PB3,PB4作为普通I/O口的问题。在最初画PCB时,没有太仔细看手册,结果把PB3,PB4也当做普通I/O口来用了,在程序中把所有引脚都置高时,却发现PB4引脚还是低电平。后来回去查手册,发现PB4的主功能是NJTRST,PB3的主功能是JTDO。所以必须使用它们的端口重定义功能,但是在void GPIO_PinRemapConfig(u32 GPIO_Remap, FunctionalState NewState)函数查表时,并没有重映射PB3,和PB4这个功能。后来经过仔细观察,在函数表中发现了
尝试着在函数中写入GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);再重新下载,发现所有I/O口均被成功拉高了。
2.(1) 关于CAN通信中的ID号问题。在刘洋老师的视频中,ID号先右移5位,比如想发送0xFF,他的函数中写的是TxMessage.StdId=0x00FF>>5;但是我实际上使用的并不用右移。
(2)关于接收ID的屏蔽滤波问题。我的程序中CAN通信均发送标准数据帧,屏蔽滤波使用了32位滤波器,可接收范围为0x0000~0x000F,原理如下:
3. 关于接收数据的处理。因为在can中断中收到的数据是存在8个数组中的RxMessage.Data。所以如何把他们提取出来,我采用的方法是定义了一个int aa[8],然后依次用移位与1与的方法,把数组中的数据1位位提取出来。如a[0]= RxMessage.Data[0]&1;a[1]= (RxMessage.Data[0]>>1)&1;依次类推,即可把一个字节中的数据内容都提取出来,依此方法循环,再把其余7个字节中的数据进行提取,进行下一步的处理。
4.在发送小板发送数据时,把CAN的数据进行传递进去的时候定义了一个指针,把数组的首地址传入进去,这样觉得比较方便。
附件中带了主板的原理图和发送小板的程序以及接收小板的程序,加带了注释,可供新手进行学习参考(—_-||)接收小板的程序上传不了了,说我今日无法上传那么大的附件,以后传上来吧
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|