智能小车之PWM脉冲控制小车调速
生活随笔
收集整理的這篇文章主要介紹了
智能小车之PWM脉冲控制小车调速
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
一、PWM脈沖控制小車調速
二、代碼實現
一、PWM脈沖控制小車調速
原理:全速前進是LeftCon1A = 0;LeftCon1B?= 1;完全停止是LeftCon1A = 0;LeftCon1B?= 0;
那么單位時間內比如:20ms,有15ms是全速前進,5ms是完全停止,速度就會比5ms全速前進,15ms完全停止獲得的功率多,相應的速度更快
二、代碼實現
main.c
#include "motor.h" #include "delay.h" #include "uart.h" #include "time.h"extern char speed; //此變量/函數是在別處定義的,要在此處引用void main() {Time0Init(); //定時器初始化UartInit(); //串口初始化while(1){speed = 10; //10份單位時間全速運行,30份停止,所以慢,20ms是40份的500usDelay1000ms();Delay1000ms();speed = 20;Delay1000ms();Delay1000ms();speed = 40;Delay1000ms();Delay1000ms();} }motor.c
#include "reg52.h"sbit RightCon1A = P3^2; sbit RightCon1B = P3^3;sbit LeftCon1A = P3^4; sbit LeftCon1B = P3^5;void goForWard(){ //小車前轉LeftCon1A = 1;LeftCon1B = 0;RightCon1A = 1;RightCon1B = 0; }void goBack(){ //小車后轉LeftCon1A = 0;LeftCon1B = 1;RightCon1A = 0;RightCon1B = 1; }void goLeft(){ //小車左轉LeftCon1A = 0;LeftCon1B = 0;RightCon1A = 1;RightCon1B = 0; }void goRight(){ //小車右轉LeftCon1A = 1;LeftCon1B = 0;RightCon1A = 0;RightCon1B = 0; }void stop(){ //小車停止LeftCon1A = 0;LeftCon1B = 0;RightCon1A = 0;RightCon1B = 0; }motor.h
void goForWard(); void goBack(); void goLeft(); void goRight(); void stop();delay.c
#include "intrins.h"void Delay1000ms() //@11.0592MHz {unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i); }void Delay10ms() //@11.0592MHz {unsigned char i, j;i = 18;j = 235;do{while (--j);} while (--i); }delay.h
void Delay1000ms(); void Delay10ms();uart.c------串口初始化文件
#include "reg52.h" #include "motor.h" #include "string.h" #include "delay.h" #define SIZE 12sfr AUXR = 0x8E; char cmd; char buffer[SIZE];void UartInit(void) //9600bps@11.0592MHz {AUXR = 0x01; //降低時鐘對外界的輻射SCON = 0x50; //串行口寄存器工作模式選擇方式1,RNE=1,為串行允許接收狀態TMOD &= 0x0F; //定時器1工作方式位8位自動重裝TMOD |= 0x20;TH1 = 0xFD; TL1 = 0xFD; //9600波特率的初值TR1 = 1; //啟動定時器EA = 1; //總中斷寄存器,開啟總中斷ES = 1; //開啟串口中斷}uart.h
void UartInit(void);time.c ------定時器初始化及定時器開啟中斷文件
#include "motor.h" #include "reg52.h"char speed; char cnt = 0;void Time0Init(){//1、配置定時器0工作模式位16位計時TMOD = 0x01;//2、給定時器一個初值,每個周期都等于0.5msTL0 = 0x33;TH0 = 0xFE;//3、定時器開始計時TR0 = 1;TF0 = 0; //4、打開中斷定時器ET0 = 1;//5、設置總中斷定時器EA = 1;}void Time0Handler() interrupt 1 //定時器0的中斷號為 interrupt 1 {cnt ++; //統計爆表的次數//給定時器重新定義初值,每個周期都等于0.5msTL0 = 0x33; TH0 = 0xFE;//控制PWM波形if(cnt < speed){//前進goForWard(); }else{//停止stop(); }if(cnt == 40){ //要爆表40次,經過了20mscnt = 0; //當100次表示1s,重新讓cnt從0開始,計算下一次的1s } }time.h
void Time0Init();總結
以上是生活随笔為你收集整理的智能小车之PWM脉冲控制小车调速的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA组件--经典合集--JIDE C
- 下一篇: gMIS吉密斯十年执念:Lower Co