本次毕业设计使用CAN总线传输数据,通过CAN的环回模式与正常工作模式对三个节点实现LED点灯,蜂鸣器报警,控制电机正反转并在LCD上显示数据的功能。按照本次毕业设计任务书的要求,本论文使用了意法半导体生产的STM32F407 作为主控制芯片,设计出利用 CAN 总线在3个短节间进行数据传输的系统,通过编写单片机程序,并完成多个独立电路板上单片机的CAN总线通信调试。读取STM32F407的数据手册和CAN总线等文献后确定节点的总体设计方案,大体包括整个系统的电源部分,微处理器,LED,按键,蜂鸣器,直流电机,液晶显示模块等。系统总体结构与最终实物图如下图所示。
源码的网盘链接:
https://pan.baidu.com/s/1IHN3M0tYX9G2OHo59CRI9g
提取码:boge
复制这段内容后打开百度网盘手机App,操作更方便哦
关于CAN总线的介绍本文并不提及,直接从其优点说起:
一、 CAN总线优点
(1)传输距离较远,当以1Mbit/S的高速率传输数据时距离可达到100米,以5Kbit/S的低速率传输数据时,传输距离可以达到10千米;
(2)系统具有柔软性,CAN总线是CAN_H与CAN_L的双线串行通信方式,能够适用于高噪声的环境中,具有良好的抗干扰能力。对于普通单端信号来讲,以阈值电压作为信号逻辑1或者0,这种信号受到电压的影响较大,有可能需要远高于5V的电压才能使其电平为1,但许多常用微控制器都是3.3V-5V的工作电压,难以把控其阈值电压。而CAN总线中的CAN_H与CAN_L是一对差分信号,可以保证数据正确无误的传输;
(3)多主从结构,每个节点都必须对应有一个属于自己的CAN控制器和CAN收发器,如果多个短节同时向外发送数据,那么CAN会以发送的ID号为标志自动进行识别,根据各节点的需要来选择是否接收数据,并且每当一个短节发送完数据后其他节点可以检测出CAN总线空闲并立刻发送数据。这样从机发数据时就不用询问主机,极大的提高了总线利用率;
(4)错误处理以及检错机制非常方便于平时的实践应用;
(5)可以重发遭到破坏的信息。
二、CAN总线工作原理
当两个或两个以上的节点同时向CAN总线发送信息时,低优先级的节点将中止,而高优先级的节点将继续而不受任何影响。这样可以节省总线仲裁冲突时间,即使网络负担过重,也不会出现网络瘫痪。在实际通信过程中,CAN总线就好比十字路口的交警,根据一条线路或一个区域内的不同交叉口的重要性,设置不同的优先顺序放行,保证了主要交叉口的畅通,进一步提高了数据的传输效率。这里的数据传输类似于码分多址技术,在CDMA系统中不同的“客户”传输信息的甄别方式就是靠着不同的编码序列。
**三、CAN波特率的配置
**
STM32F407 CAN属于APB1总线,APB1总线的默认配置最大主频为42MHZ。而STM32F103最大主频为36MHZ。因此在计算数据波特率时需要知道 BS1和 BS2 的值,就可以计算出CAN 通信的波特率:
tq = (BRP[9:0] + 1)×tPCLK
tBS2 = tq x (TS2[2:0] + 1)
tBS1 = tq x (TS1[3:0] + 1)
NominalBitTime = 1 × tq+tBS1+tBS2
Baud Rate = 1 / Nominal Bit Time
需要注意的一点是:如果相同器件进行CAN通信,那么需要将它们都设置成一样的波特率才能进行CAN通信。如下便是将32初始化环回模式并将波特率设置为500kbps
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_LoopBack);
四、工作模式
本次采用了CAN的环回模式以及正常工作模式。
CAN模块的工作模式包括配置模式、正常工作模式、回环模式、监听模式和禁止模式等。本论文只使用了CAN模块的普通模式以及环回模式,其他模式并未调用。通过写入CAN控制寄存器1中的请求工作模式位REQOP<2:0>(CiCTRL1<10:8>)来请求所需的工作模式。CAN模块通过OPMODE<2:0~>位(CiCTRL1<7:5>)确认进入所请求的模式。
(1)正常工作模式:在该模式下,CAN模块可以发送和接收CAN报文。初始化之后可以配置正常工作模式,配置方法是将REQOP<2:0>位(CiCTRL1<10.8>)编程为000。当OPMODE<2:0>=000时,模块开始正常工作。该模式需要另一个节点来回应,因此本论文选择3个使用STM32作为微控制器的节点来检测该模式。
(2)回环模式:在这个模式下可以用来进行系统自检,让CAN模块接收它自己的报文。在环回模式下,CAN发送路径在内部会与发送路径相连接从而出现“假”应答(自发自收),因此并不需要别的节点来回应。
五、各部分电路介绍
复位电路
单片机中的复位电路有很多种,下面主要对看门狗复位以及低电平复位进行讲解:通过看门狗定时器进行的内部复位是为了防止程序进入无限循环,提高单片机的抗干扰能力。可选用微处理器控制的CMOS芯片,它可以切换支持电池和进行看门狗监测。CMOS芯片的监视器输入引脚与MCU的引脚相连。复位输出引脚与微控制器的复位输入引脚相连。使用这样的引脚复位方式将减少200ms溢出脉冲信号,使控制器快速复原。本论文中所采用的是低电平复位电路,当按键按下时,RESET信号由高电平1变为低电平0时电路便复位。其中R24 和 C48共同构成了上电复位电路。
晶振电路
晶振分为有源晶振和无源晶振,其中有源晶振指的是内部除了有石英晶体外还设计有完整的外围振荡电路,通电后即可产生稳定的方波输出的一类晶体振荡器,而无源晶振则是指自身没有办法产生振荡信号的晶体振荡器。
在低频模拟电路及数字电路中常用的晶振频率值如下:32.768KHZ(经15次分频可得1HZ的基础频率,广泛用于时钟电路)、3.579545MHZ(主要用于彩色电视机、双音多频电话机电路)、8MHZ(单片机中的常用整数频率,便于计算机器周期)、11.0592MHZ(可分解为1152×9600,在UART异步通信的51系列单片机中收到了热烈的欢迎)、14.318MHZ(计算机主板的时钟晶振)。STM32F407微控制器带有一个8M的外部高速时钟晶振和一个32.768KHZ的无源晶振,其中外部RTC使用一节纽扣电池进行供电,以保证在系统断电的情况下时间与日历依旧能够正常运行。
电源电路
除了U15为DC-DC芯片,其余两个稳压器均为LDO芯片。DC_IN使用DC接口将外部5V-24V的直流电源引入,经过U15(DC-DC芯片)转换为5V电源输出,因为二极管负向接了SW,正向接地,并且电感L2接在了SW和负载之间,所以U15在此充当了降压变换器的角色。其中 D4二极管也可称其为防反接二极管,在这里起到的作用是防止外部直流电源的正负极混淆接错时烧坏元器件。K1(自锁开关)作为PCB板的总电源,F1是1000mA的自恢复保险丝(可以使用铝 镁 锡等熔点较低的金属代替),起到了保护电路的作用。U16、U18作为LDO三端稳压器芯片,起到的作用只能是降压-将PCB板内部5V的直流电源转为3.3V电源。其中数模之间采用分开供电的方式,数字电路使用U16输出的3.3V电源,而模拟电路使用的则是U18输出的3.3V电源。
JTAG调试接口电路
本次使用的是JTAG 接口, STM32既可以JTAG 接口也可以使用SWD接口下载并调试代码。STM32 的SWD接口与JTAG是共用的,因此并不需要 JTAG 这么多线,可以省下大量IO口。常见的J-LINK、ST-LINK都可以支持SWD接口。
CAN通信接口模块
本次CAN通信接口电路需实现三个节点之间数据传输。在此CAN通信接口电路使用外部集成收发器电路,如果时钟分配器寄存器中未启用比较器旁路功能,则必须将RX输入连接到现有收发器电路的参考电压输出。本论文使用了内部具有CAN控制器功能的STM32微控制器,将CAN收发器TJA1051与MCU的CAN接口相连后把三个节点的TJA1051的CAN_H接CAH_H,CAN_L接CAN_L。因为CAN收发器可以把总线上传输的数据转变成CAN总线能够识别的差分信号。其中R1为120Ω的终端电阻,因为CAN通信数据是串行差分传输的,终端电阻所起到的作用就是避免了信号的反射和干扰,增强了数据传输的抗干扰性。选择120Ω的原因是因为电缆的特性阻抗为120Ω,要对其进行阻抗匹配如果阻抗并不匹配,那么总线的抗干扰能力将大打折扣。TJA1051属于第三代高速CAN收发器半导体,与第一代和第二代相比有显著改进。它提供了改进的电磁兼容性(EMC)和静电放电(ESD)性能,TJA1051T可以直接连接到不需要通过总线具有唤醒待机模式的微控制器3 V至5 V的电源电压。
LCD 模块接口
TFT_LCD是一个钢化玻璃电阻式触摸液晶显示屏。LCD模块与STM32F407ZGT6提供的FSMC接口相连,TFT屏的29、30、31、33引脚被用来对TFT屏幕的控制。在非必须使用的情况下建议不去调用LCD或者对其使能,因为LCD的使用会大幅度地增加功耗,从而使CPU出现表面发热,程序运行慢或者死机等负面现象。LCD_TFT的复位引脚RESET与MCU的复位进行关联,C38、C39充当滤波电容,起到了滤除杂波、提高稳定性的作用。
按键
KEY0、KEY1、KEY2、KEY3和KEY4为四脚微动按键,在本论文中被用来控制彩色LED灯、蜂鸣器、电机的正反转以及停止,微控制器的PE6、PE5、PE2、PE3、PE4引脚分别对应按键4、3、2、1、0。该电路的5个当做普通输入的按键可以后接去抖电容,增加电路稳定性。KEY_UP 按键连接到 PA0(STM32 的 WKUP 引脚),它不仅可以用作普通输入按键,还可以当作STM32的唤醒输入(KEY_UP这个按键是高电平触发的)。
蜂鸣器
本次设计选用的是低电平触发的有源蜂鸣器,这里的“源”是指自身包含有振荡电路,而不是指电源。低电平触发的有源蜂鸣器是指只需要BEEP引脚接收到低电平便可以使其正常工作的蜂鸣器。而如果是无源蜂鸣器,就必须要加上大于2KHZ的驱动信号才会发声。图中使用的三极管Q1为8050封装,它起到了放大电流的作用,R61是一个可以将电平拉低的电阻,为的是避免微控制器复位的时候蜂鸣器可能不受控制而发出声响的现象。BEEP信号直接连接在MCU的PF8上,如果使用的是无源蜂鸣器,想要达到不同的音效,那么可以把PF8当作PWM输出。
电机
本次设计所使用了L298N电机驱动模块,双路H桥电机驱动,可以同时驱动两路直流电机或者1个4线两相式步进电机;输入电压1.8-7V;单路工作电流1.5A,峰值电流可达2.5A,低待机电流(小于 0.1uA);内置防共态导通电路,输入端悬空时,电机不会误动作;内置带迟滞效应的过热保护电路(TSD),无需担心电机堵转;INx接单片机10或者其他信号源,MOTOR-A和MOTOR-B端接电机供电电压范围为2V-10V,因为其每路的电流范围为1.5A-2.5A,所以本次可使用充电宝(5V 2A)作为电源输入。电机驱动模块非常适合在电池供电的智能小车、玩具小车、机器人等上面使用,有热保护并且能够自动恢复。
一般情况下H桥使用最普遍的是有刷直流电机以及双极步进电机,本论文设计中使用的电机驱动模块由两个H桥构成以此来驱动两个直流电机(通过控制4个MOS管的开与关来使电机正反转)或者使用IN1与IN2引脚来进行PWM调速,控制步进电机的转动角度。MOTOR-A和MOTOR-B接电机两端,IN1-IN4接STM32F407的IO口(两个最小系统板的PC2和PA2),直流电机驱动逻辑真值表如下:
六、系统软件设计
本次毕业设计软件代码部分是在Keil u Vision5上进行编程的,因为Keil5支持很多ARM系列芯片,并有STM323固件库等。因其支持ST-LINK与J-LINK进行上位机与下位机通信的调试,极大的方便了本次论文代码部分的编写。
本次毕业设计的系统软件分为三个部分:一是为执行程序,包括数据的传输、接收并处理数据等。二是系统的主程序,对于CAN控制器进行设置,选择需要用到的工作模式,对其功能进行定义,设置好执行辨别的ID号;三是对于执行器部分进行编码,包括在LCD液晶上显示其他两个节点发送的数据以及一个0-255的计数器、按键输入控制其他执行器、直流电机的控制、LED小彩灯以及有源蜂鸣器的执行;需要根据各种功能需要进行代码的编写。系统软件设计总体流程图如下图所示。
七、致谢
本人的毕业论文及设计之所以能够顺利完成,首先要感谢我的毕业设计指导老师党博。从最初的拟定题目到后来的实践操作,老师都给予了我莫大的支持以及耐心的指导,在这里我真心感谢老师的传道解惑并向老师表达崇高的敬意。其次要感谢雷杨博同学对于软件部分的耐心讲解。虽然自己最终并未达到预期的效果,但过程很充实,以前会为自己画过4层的飞控板而感到高兴,现在知道了那最多算抄板工,要从根本上了解电路并加以应用。尤其是老师说的“软硬不分家” 让我意识到了自己要不懈地努力,我会将学无止境铭记于心,时刻提醒自己。在以后的工作中做到勤学好问,并且对自己要有清晰的认识,这其中就包括清楚认识到自身的优缺点并加以改正。实践出真知,多动手才会得到自己想要的结果,就像老师带着我们参加电赛一样,值得回忆。