|
求各位大佬幫幫忙指點(diǎn)一下
現(xiàn)在有兩個(gè)問題,給A1A2高電平時(shí),LO會(huì)隨著HO的導(dǎo)通逐漸關(guān)閉,而不是一直關(guān)閉的狀態(tài),給A1A2低電平時(shí),LO不導(dǎo)通,不知道是什么原因求各位大佬幫忙看看什么問題
Screenshot_20220626_170914_com.UCMobile_edit_63575616522069.jpg (228.01 KB, 下載次數(shù): 42)
下載附件
2022-6-26 17:16 上傳
單片機(jī)源程序如下:
#include<reg51.h>
#include<intrins.h>
#define u8 unsigned char
#define u16 unsigned int
//----------------------------------------------------------
//STC15寄存器聲明
sfr P1M1=0x83;
sfr P1M0=0xE3;
sfr P3M1=0xB1;
sfr P3M0=0xB2;
sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sfr IE2=0xaf;
//----------------------------------------------------------
//引腳定義
sbit A1=P3^2;
sbit A2=P3^6;
sbit AK=P3^3;
sbit B1=P1^2;
sbit B2=P1^4;
sbit BK=P1^3;
sbit IN1=P1^0;
sbit IN2=P1^1;
//----------------------------------------------------------
//軟件PWM
u8 PWM_count;
u8 PWM_duty_A;
u8 PWM_duty_B;
u8 PWM_value;
//----------------------------------------------------------
//控制
u16 timer1,timer2;
u16 pulse;
u16 IN1_H_time,IN2_H_time;
bit IN1_last,IN2_last;
bit get_pulse1,get_pulse2;
bit get_new;
int mix_x,mix_y;
bit Direction_A,Direction_B;
int pulse1=150,pulse2=150;
u8 lose_A=20,lose_B=20; //更新:上電默認(rèn)處于失控狀態(tài),防止第一次信號(hào)檢測(cè)錯(cuò)誤
//----------------------------------------------------------
//混控設(shè)置
bit mix_en=0; //關(guān)閉混控,兩路獨(dú)立
//bit mix_en=1; //開啟混控
void delay_ms(u16 ms) //STC15 @12.000MHz
{
u16 i;
do{
i = 12000000 / 13022;
_nop_(),_nop_(),_nop_();
while(--i) ;
}while(--ms);
}
void delay_us(u8 us) //@12.000MHz
{
while(--us)
_nop_(),_nop_();
}
void shock( u8 n) //震動(dòng)發(fā)聲
{
u8 i;
for(i=0;i<250;i++)
{
A1=0,A2=0;
B1=0,B2=0;
delay_us(n);
A1=1;B1=1;
A2=0;B2=0;
delay_us(n);
A1=0;B1=0;
A2=0;B2=0;
delay_us(n);
A2=1;B2=1;
A1=0;B1=0;
delay_us(n);
}
A1=0,A2=0;
B1=0,B2=0;
delay_us(n);
}
main()
{
P1=0xE3;
P3=0xB0; //上電關(guān)閉輸出
P3M0=0x4C; //IO推挽輸出
P1M0=0x1C;
//P5M0=0x0F;
delay_ms(400);
shock(200); //新增 上電音樂,表明正常工作
shock(150);
shock(100);
IE=0x80;
IE2=0x04;
T2L=0xF6;T2H=0xFF; //開啟軟件PWM
AUXR=0x10;
while(1)
{
if(get_pulse1)
{
get_pulse1=0;
pulse =IN1_H_time;
IN1_H_time=0;
if(pulse >85 && pulse <215) //只受理合理舵量范圍
{
timer1=0;
if(pulse <105)pulse =105;
if(pulse >195)pulse =195;
if(lose_A)lose_A--; //丟信號(hào)重連保護(hù)
else get_new=1,pulse1=pulse;
}
}
if(get_pulse2)
{
get_pulse2=0;
pulse =IN2_H_time;
IN2_H_time=0;
if(pulse >85 && pulse <215)
{
timer2=0;
if(pulse <105)pulse =105;
if(pulse >195)pulse =195; //舵量限幅 1050~1950
if(lose_B)lose_B--; //丟信號(hào)重連保護(hù)
else get_new=1,pulse2=pulse;
}
}
if(get_new)
{
get_new=0;
if(mix_en) //引腳高電平 使能混控
{
if(pulse2>152 || pulse2<148) //通道2為差向輸入,中位死區(qū)
{
mix_x=pulse1 + pulse2 -150;
mix_y=pulse1 - pulse2 +150;
}
else
{
mix_x=pulse1; //通道1為同向輸入,
mix_y=pulse1;
}
}
else //引腳低電平 兩通道獨(dú)立
{
mix_x=pulse1;
mix_y=pulse2;
}
if(mix_x<105)mix_x=105;
if(mix_x>195)mix_x=195;
if(mix_y<105)mix_y=105;
if(mix_y>195)mix_y=195;
if(mix_x>=153 ) //正轉(zhuǎn)
{
AK=1;
A2=0;
PWM_duty_A= (mix_x-151)*100/44; //補(bǔ)償摩擦力
Direction_A=0;
}
else if(mix_x<=147 ) //反轉(zhuǎn)
{
AK=1;
A1=0;
PWM_duty_A= (149-mix_x)*100/44;
Direction_A=1;
}
else //停止
{
PWM_duty_A=0;
AK=0;
}
if(mix_y>=153 ) //正轉(zhuǎn)
{
BK=1;
B2=0;
PWM_duty_B= (mix_y-151)*100/44; //補(bǔ)償摩擦力
Direction_B=0;
}
else if(mix_y<=147 ) //反轉(zhuǎn)
{
BK=1;
B1=0;
PWM_duty_B= (149-mix_y)*100/44;
Direction_B=1;
}
else //停止
{
PWM_duty_B=0;
BK=0;
}
}
}
}
void T2_isr()interrupt 12//軟件PWM 1Khz
{
if(IN1) //通道1脈寬檢測(cè)
{
IN1_last=1;
IN1_H_time++;
}
else
{
if(IN1_last)get_pulse1=1;
IN1_last=0;
}
if(IN2) //通道2脈寬檢測(cè)
{
IN2_last=1;
IN2_H_time++;
}
else
{
if(IN2_last)get_pulse2=1;
IN2_last=0;
}
PWM_count++;
if(PWM_count==100) //100級(jí)分辨率
{
PWM_count=0;
timer1++;
if(timer1>500)//0.5S無(wú)信號(hào)保護(hù)
{
timer1=0; lose_A=30;
pulse1=150,get_new=1;
}
timer2++;
if(timer2>500)//0.5S無(wú)信號(hào)保護(hù)
{
timer2=0; lose_B=30;
pulse2=150,get_new=1;
}
}
if(PWM_duty_A > PWM_count)
{
if(Direction_A)
A1=1;
else A2=1;
}
else A1=0,A2=0;
if(PWM_duty_B > PWM_count)
{
if(Direction_B)
B1=1;
else B2=1;
}
else B1=0,B2=0;
} |
|