標(biāo)題:
51單片機(jī)用中斷做pwm調(diào)速,老是在2V左右有大哥給看看嗎
[打印本頁]
作者:
張事坤
時間:
2019-2-27 11:20
標(biāo)題:
51單片機(jī)用中斷做pwm調(diào)速,老是在2V左右有大哥給看看嗎
51單片機(jī)用中斷做pwm調(diào)速,占空比從0-100逐漸增大,但是程序輸出端口老是在2V左右上不去,有大哥給看看嗎具體問題在中斷1,
這是一個藍(lán)牙小車程序
#include <reg52.h>
sbit EN1 = P2^0; //為1 右電機(jī)使能
sbit EN2 = P2^1; //為1 左電機(jī)使能
sbit IN1 = P2^2; //為1 右電機(jī)反轉(zhuǎn)
sbit IN2 = P2^3; //為1 右電機(jī)正轉(zhuǎn)
sbit IN3 = P2^4; //為1 左電機(jī)正轉(zhuǎn)
sbit IN4 = P2^5; //為1 左電機(jī)反轉(zhuǎn)
#define left_motor_en EN1 = 1 //左電機(jī)使能
#define left_motor_stops EN1 = 0 //左電機(jī)停止
#define right_motor_en EN2 = 1 //右電機(jī)使能
#define right_motor_stops EN2 = 0 //右電機(jī)停止
#define left_motor_go IN1 = 0, IN2 = 1 //左電機(jī)正傳
#define left_motor_back IN1 = 1, IN2 = 0 //左電機(jī)反轉(zhuǎn)
#define right_motor_go IN3 = 1, IN4 = 0 //右電機(jī)正傳
#define right_motor_back IN3 = 0, IN4 = 1 //右電機(jī)反轉(zhuǎn)
double count = 0;//定義占空比,并初始占空比為26%
unsigned char time;
unsigned char pwm_left_val = 255;//左電機(jī)占空比值 取值范圍0-170,0最快
unsigned char pwm_right_val = 255;//右電機(jī)占空比值取值范圍0-170 ,0最快
unsigned char pwm_t = 0; //周期
void UART_INIT(); //藍(lán)牙接收初始化
void Che_init(); //小車輸出端口定時器初始化
void forward(); //小車前進(jìn)
void back(); //小車后退
void right(); //小車左轉(zhuǎn)
void left(); //小車右轉(zhuǎn)
void stop(); //小車停止
void delay(unsigned int z); //延時函數(shù)
void main()
{
UART_INIT(); //藍(lán)牙接收初始化
Che_init(); //小車輸出端口定時器初始化
while(1);
}
void UART_INIT() //藍(lán)牙接收初始化
{
SCON = 0X50;
TMOD = 0x20; //8位自動重裝模式
TH1 = 0xfd;
TL1 = 0xfd; //9600波特率
TR1 = 1; //啟動定時器1
ES = 1; //開串口中斷
EA = 1; //開總中斷
}
void Che_init() //小車使能輸出端口定時器初始化
{
TMOD|= 0x02; //8位自動重裝模塊
TH0 = 0xdc;
TL0 = 0xdc; //11.0592M晶振下占空比最大比值是256,輸出100HZ
TR0 = 1; //啟動定時器0
ET0 = 1; //允許定時器0中斷
EA = 1; //總中斷允許
}
void forward() //小車前進(jìn)
{
ET0 = 1;
TR0 = 1;
left_motor_go; //左電機(jī)前進(jìn)
right_motor_go; //右電機(jī)前進(jìn)
}
void back() //小車后退
{
ET0 = 1;
TR0 = 1;
left_motor_back; //左電機(jī)反轉(zhuǎn)
right_motor_back; //右電機(jī)反轉(zhuǎn)
}
void right() //小車左轉(zhuǎn)
{
ET0 = 1;
TR0 = 1;
left_motor_go; //左電機(jī)正傳
right_motor_back; //右電機(jī)反轉(zhuǎn)
}
void left() //小車右轉(zhuǎn)
{
ET0 = 1;
TR0 = 1;
right_motor_go; //右電機(jī)正傳
left_motor_back; //左電機(jī)反轉(zhuǎn)
}
void stop() //小車停止
{
ET0 = 0;
TR0 = 0;
count = 0;
left_motor_stops; //左電機(jī)停止
right_motor_stops; //右電機(jī)停止
}
void timer0() interrupt 1 //定時器0中斷
{
pwm_t++;
pwm_left_val--;
if(pwm_left_val <= pwm_t)
EN1 = 1;
else
EN1 = 0;
if(pwm_t == 255)
pwm_t = 0;
/*
pwm_t++;
// pwm_left_val--;
// pwm_right_val--;
if(pwm_t == 255)
{
EN1 = 0;
EN2 = 0;
pwm_t = 255;
}
if(pwm_left_val == pwm_t)
EN1 = 1;
if(pwm_right_val == pwm_t)
EN2 = 1;*/
}
void UART_SER() interrupt 4 //串口中斷
{
if(RI)
{
RI = 0;//清除接收標(biāo)志
switch(SBUF)
{
case 'a': //前進(jìn)
forward();
break;
case 'b': //后退
back();
break;
case 'l': //左轉(zhuǎn)
right();
break;
case 'r': //右轉(zhuǎn)
left();
break;
case 's': //停止
stop();
break;
default: //否則全部停止
stop();
break;
}
}
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
作者:
zhanghoub
時間:
2019-2-27 11:46
把IO口設(shè)置成推挽模式試一下
作者:
煤氣阿
時間:
2019-3-1 11:02
能問下你藍(lán)牙功能是直接用的現(xiàn)成的藍(lán)牙模塊嗎?
作者:
腦瓜兒疼
時間:
2019-3-3 15:22
想問一下,那個電機(jī)使能對應(yīng)的I/O口是連接著驅(qū)動模塊的總開關(guān)那個地方嗎
作者:
1872468521
時間:
2019-3-4 09:21
十六位自動重載模式 TMOD|=0x01 ,1T的工作模式,設(shè)定為100us,頻率可達(dá)1khz。調(diào)占空比即可,實測精度很高
作者:
7358655
時間:
2019-3-4 22:50
從你程序里沒發(fā)現(xiàn)DA芯片,也沒說有有運放跟隨電壓輸出電路,單pwm效果不理想正常。不太懂回答可能不理想。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1