其實論壇中有很多這樣的程序,一看你的程序,行數就不夠嘛——根本沒有調速的內容。
在智能小車板塊中去找。
/**********************亞博智能小車黑線循跡例程************************
* 學習建議:進行智能小車程序學習前,可先看51單片機開發板配套28課視頻教程
******************************************************************/
//按下K4按鍵,1秒左右啟電小車
//按下復位健可以停止小車
//注意程序只做參考之用,要達到最理想的尋跡效果,還需要同學們細心調試。
#include <reg52.h> //包含52系統頭文件
#include "bst_car.h" //包含bst_car.h智能小車頭文件
unsigned char pwm_val_left =0;//變量定義
unsigned char pwm_val_right =0;
unsigned char push_val_left =5;// 左電機占空比N/20 //速度調節變量 0-20。。。0最小,20最大
unsigned char push_val_right=5;// 右電機占空比N/20
// 大家可以根據循跡效果修改以上兩個數值
bit Right_PWM_ON=1; //右電機PWM開關
bit Left_PWM_ON =1; //左電機PWM開關
//延時函數
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=112;j>0;j--);
}
//前進
void run(void)
{
push_val_left=6; //速度調節變量 0-20。。。0最小,20最大
push_val_right=6;
Left_moto_go ; //左電機往前走
Right_moto_go ; //右電機往前走
}
//左轉
void leftrun(void)
{
push_val_left=5;
push_val_right=5;
Right_moto_go ; //右電機往前走
Left_moto_Stop ; //左電機停止
}
//右轉
void rightrun(void)
{
push_val_left=5;
push_val_right=5;
Left_moto_go ; //左電機往前走
Right_moto_Stop ; //右電機往前走
}
//停止
void stop(void)
{
Left_moto_Stop ;
Right_moto_Stop ;
}
/************************************************************************/
// PWM調制電機轉速
// 左電機調速
/*調節push_val_left的值改變電機轉速,占空比*/
void pwm_out_left_moto(void)
{
if(Left_PWM_ON)
{
if(pwm_val_left<=push_val_left)
{
EN1=1;
}
else
{
EN1=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
EN1=0; //若未開啟PWM則EN1=0 左電機 停止
}
}
/******************************************************************/
/* 右電機調速 */
void pwm_out_right_moto(void)
{
if(Right_PWM_ON)
{
if(pwm_val_right<=push_val_right) //20ms內電平信號 111 111 0000 0000 0000 00
{
EN2=1; //占空比6:20
}
else
{
EN2=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
EN2=0; //若未開啟PWM則EN2=0 右電機 停止
}
}
//TIMER0中斷服務子函數產生PWM信號
void timer0()interrupt 1 using 2
{
TH0=0XFC; //1Ms定時
TL0=0X66;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void keyscan(void) //按鍵掃描函數
{
A: if(K4==0) //判斷是否有按下信號
{
delay(10); //延時10ms
if(K4==0) //再次判斷是否按下
{
FM=0; //蜂鳴器響
while(K4==0); //判斷是否松開按鍵
FM=1; //蜂鳴器停止
}
else
{
goto A; //跳轉到A重新檢測
}
}
else
{
goto A; //跳轉到A重新檢測
}
}
//主函數
void main(void)
{
P1=0X00; //關電機
keyscan(); //按鍵啟動檢測
delay(1000);//1s后啟動
TMOD=0X01;
TH0= 0XFC; //1ms定時
TL0= 0X66;
TR0= 1;
ET0= 1;
EA = 1; //開總中斷
while(1) //無限循環
{
//有信號為0 沒有信號為1
if(Left_1_led==0&&Right_1_led==0)
run(); //調用前進函數
else if(Left_1_led==1&&Right_1_led==0) //左邊檢測到黑線
{
leftrun(); //調用小車左轉函數
}
else if(Right_1_led==1&&Left_1_led==0) //右邊檢測到黑線
{
rightrun(); //調用小車右轉函數
}
else
stop();
}
}
這個程序是由程序固定調速的,你可以看懂后,通過按鍵等改變相關的值,達到電機動態調速。
|