内容发布更新时间 : 2024/12/23 0:46:00星期一 下面是文章的全部内容请认真阅读。
脉冲宽度调制本身在各个行业当中都有着很多的应用也很有潜力,PWM因为它的信号都是以数字的形式,所以减少了不必要的数模转换,又进而体现出它的抗噪能力和更小空间体积,从某种程度上来说也能促进节能减排。但是在这次设计中,虽然使用到了脉冲宽度调制,但是只是仅仅使用了它的皮毛,并未真正的深度探究。
除了脉冲宽度调制之外,在电机与舵机的程序中,另一个用到的相对重要的就是中断系统,下面将对中断系统做出简单的介绍。
其实中断系统很好理解,就是系统在执行某一个程序的时候,突然接到了更加优先的指令,就会暂停原程序的执行,转而开始执行指令所对应的程序,等到该程序执行完成之后再返回开始执行原程序。
在单片机的管脚中,低四位控制着外部中断,单片机的1号与3号管脚IE0/IE1为外部中断申请标志位,在判断单片机是否有收到外部中断请求的时候,通常会利用这两个管脚的值来判断,当其没有受到外部中秋的时候,其值为“0”,而当它收到外部的中断请求之后,它们的值则会变为“1”。单片机的0号与2号引脚IT0与IT1 则为外部中断请求的触发方式的选择位,当其值为0时表明在INT0/INT1端口的外部中断的方式为低电平有效,而当它们的值为1时,则表明负跳变有效。
在CPU中对中断系统的所有中断以及任意一个中断原的开放或者屏蔽,是由中断允许寄存器IE所控制的。其中EA端口的电位对整个中断尤为重要,因为它是IE的中断总允许位,而当其值为“0”时则表示所有的中断将被禁止且不被处理,而其值为“1”时则是中断是被允许的也是会被处理的。ET1为定时器T1中断允许位,当值为0时禁止中断,当值为1是则允许中断。ET0则为定时器T2的中断允许位,它的值的设置与ET1相同。ES,EX1,EX0分别为串行口中断,外部中断1,外部中断2的允许位,指的设定都为0时禁止中断,1是允许中断。
上段提到定时器中断的允许位,那么就要介绍下定时器的控制寄存器TCON,其地址为0X88。其中TF为定时器溢出标志,当接受了中断请求之后此端口就会存在溢出现象,而此时此端口的值将会自动被设置为“1”,当中断开始被执行时,此端口的赋值将会被硬件清零或者软件清零。TR则为定时器的运行控制位,值设置为1时开始计时,当其清零时则停止计时。
外部中断的方法是有低电平触发和跳沿触发,中断的撤销方式则分为定时器中断请求的撤销和外部中断请求的撤销两大类。而在本次设计中,并没有采用外部中断的方式,而是使用定时器中断,当定时器的中断请求被响应之后,硬件会自动的扫面其中断请求标志位的电位变化,并且及时的将其清零,所以定时器中断的请求都不用人为手动清零与撤销。
4.2.2电机与舵机具体控制程序介绍
首先如上一节所介绍的一样舵机与电机是通过PWM来控制的。在对程序进行编译的时候,由于PWM波的是必须依靠定时器才能够产生的,所以在编程的时候,为了能让相应波形正确的产生,就得在编程的时候首先如下列程序一样对定时器进行初始化操作:
void Time_config() {
TMOD = 0x01; //定时器0工作方式1 TL0 = 0xCE; TH0 = 0xFF;
//设置定时初值 50us //设置定时初值
}
ET0 = 1; //使能定时器0 TR0 = 1; //开启定时器0
该程序的目的在于定时器的初始化,它通过TMOD语句定义了定时器0,及工作方式1。而在52单片机中定时器有0,1两种,方式有4种,本次设计采用的是方式1所代表的16位定时器,其最大定时65536us。随后设置初始值为TL0 = 0xCE;TH0 = 0xFF;初始值的设置为意的一点是程序中是该值的16进制。然后按顺序使用TRO=1打开定时器0,再通过ETO=1使能定时器0,最后用EA=1打开总中断。但是值得注意的是在这里,还没有打开总中断。
随后,上文已介绍了PWM周期和占空比是在定时器中断中控制的,则其对应的程序如下:
void Time0_Int() interrupt 1
//定时器中断程序 中断向量口为1
首先设定了定时器在中断之后会被重新赋予初始值,并且也规定了其每产生两次中断的时间间隔为50us。而其中的打开中断,关闭中断可省略。
TR0 = 0;
//关闭定时器0, //设置定时初值 50us
//设置定时初值 //开启定时器0
TL0 = 0xCE;
TH0 = 0xFF; TR0 = 1;
通过在定时器中断中计数,也就是Time0,来计进入中断的次数。PWM的周期为50us*500 = 25ms,也就是程序中
if(Time0 > 500)
//500为PWM波周期,500*50us = 25ms
//达到501次则清零
Time0 = 0;
设置好了PWM的周期,即开始通过改变占空比的方式控制舵机与电机了。其中单片机输出舵机控制信号为Steer_PWM,对应的引脚程序前端已定义。Steer_Ctrl是我们调节占空比的,Steer_Ctrl的值越大,占空比越大,舵机输出占空比 = Steer_Ctrl/500;就是下面的程序;
if(Time0 < Steer_Ctrl) //舵机占空比=(Steer_Ctrl/Time0)*100% else
Steer_PWM = 0; Steer_PWM = 1;
同理,电机的控制也是相同的,电机输出占空比 = Motor_Ctrl/500; if(Time0 < Motor_Ctrl)
else
Motor_PWM = 0;
Motor_PWM = 1;
//电机占空比=(Motor_Ctrl/Time0)*100%
电机的输出占空比越大,电机转速越快,小车速度越快,反之亦然。
4.3遥控部分的程序设计
遥控部分的程序就是通过按键通过编码后利用发射元件对主控电路发出指令,其指令就是前文所提到的对占空比的参数的设定,但是相对于需要对信息进行处理的电机与舵机的程序来说,遥控部分的占空比的参数就是相当于一个数值的发送,而遥控部分的关键则是对矩阵键盘的应用,已经考虑到舵机的一个转弯角度而设定的一个舵机保护值。遥控部分的程序流程图如图13所示:
图13 遥控部分的程序流程图
4.3.1矩阵键盘的介绍及与独立键盘的对比
作为单片机当中经常使用的非编码键盘,其又细分为矩阵键盘和独立键盘两种。其原理图分别如图14和图15所示。就两个键盘的接线方法相比较而言,矩阵键盘的电路接线复杂,但是相对提高了I/O口的工作效率,且软件编程也相对更加复杂,但是更适合按键较多的场合。而独立键盘的电路连接则相对简单得多,但是一个按键对应一个I/O接口,这样的方式会使得当按键较多的情况出现之后,I/O口的利用率明显不足,但是相对其编程也简单的多,所以更加适合按键少的场合。在本次设计中应为考虑到会出现三档变速的三个按键,以及转向的两个按键,另外再预留两个按键,则预计会出现七个按键,这样的话明显按键较多,选着矩阵键盘更加适合。
如同在前章硬件部分说介绍的一样,按键接在2262编码器上的D3,D2,D1,与D0口上,通过每个按键所连接到的不同的引脚,使用到低电平进行区别,从而使4个端头表现出7个按键所需要表达的效果,例如按键“1”的编码为0001,按键“2”的编码为0010。