标题:
为什么我这个舵机控制程序控制舵机不受控制?
[打印本页]
作者:
陈二土
时间:
2019-8-10 20:33
标题:
为什么我这个舵机控制程序控制舵机不受控制?
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
//--定义使用的IO口--//
sbit PWM=P1^0;
sbit init=P3^1;
sbit jia=P3^2;
sbit jian=P3^3;
u16 value,timer1;
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : Timer1Init
* 函数功能 : 定时器1初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer1Init()
{
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1 = 0xFC;
TL1 = 0x18; //0.1ms
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void keyscan()
{
if(jia==0)
{
delay(1000);
if(jia==0)
{
value=value+5;
if(value==25)
{value=25;}
}
}
while(!jia);
if(jian==0)
{
delay(1000);
if(jian==0)
{
value=value-5;
if(value==0)
{value=0;}
}
}
while(!jian);
if(init==0)
{
delay(1000);
if(init==0)
{
value=5;
}
}
while(!init);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
value=5;
Timer1Init(); //定时器1初始化
while(1)
{
keyscan();
if(timer1>=25) //PWM周期为1000*1us
{
timer1=0;
}
if(timer1 <value)
{
PWM=1;
}
else
{
PWM=0;
}
}
}
/*******************************************************************************
* 函 数 名 : Time1
* 函数功能 : 定时器1的中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
TH1 = 0xFC;
TL1 = 0x18; //0.1ms
timer1++;
}
作者:
witheMe
时间:
2019-8-11 16:56
你这样写的pwm的周期是2.5ms吧,然后你的占空比间隔达到了20%,一般舵机的可接受周期为20ms,其中高电平为0.5-2.5ms时对应着最小到最大角度(非线性),你这个程序可能超出了舵机的工作频率。
作者:
陈二土
时间:
2019-8-11 20:22
witheMe 发表于 2019-8-11 16:56
你这样写的pwm的周期是2.5ms吧,然后你的占空比间隔达到了20%,一般舵机的可接受周期为20ms,其中高电平为0 ...
明白了
作者:
陈二土
时间:
2019-8-11 20:22
witheMe 发表于 2019-8-11 16:56
你这样写的pwm的周期是2.5ms吧,然后你的占空比间隔达到了20%,一般舵机的可接受周期为20ms,其中高电平为0 ...
明白了
作者:
陈二土
时间:
2019-8-11 20:25
我这样写,想通过两个定时器产生两路PWM来控制舵机,这次是20ms周期,为什么只能驱动一个???
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
//--定义使用的IO口--//
sbit PWM_v=P1^0;
sbit PWM_c=P1^1;
sbit jia_v=P3^0;
sbit jian_v=P3^1;
sbit jia_c=P3^2;
sbit jian_c=P3^3;
//定义变量
u16 value_v,value_c,timer,timer1;
//*******************************
void delay(u16 i)//延时10us
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : Timer1Init
* 函数功能 : 定时器1初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;
TH0 = 0xFF;
TL0 = 0x9C; //0.1ms
ET0=1;
EA=1;
TR0=1;
}
//************************************************************************************
void Timer1Init()
{
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1 = 0xFF;
TL1 = 0x9C; //0.1ms
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void keyscan()
{
if(jia_v==0)
{
delay(1000);
if(jia_v==0)
{
value_v++;
timer1=0;
if(value_v==25)
{
value_v=25;
}
}
}
while(!jia_v);
if(jian_v==0)
{
delay(1000);
if(jian_v==0)
{
value_v--;
timer1=0;
if(value_v==0)
{
value_v=0;
}
}
}
while(!jian_v);
//**************************************************
if(jia_c==0)
{
delay(1000);
if(jia_c==0)
{
value_c++;
timer1=0;
if(value_c==25)
{
value_c=25;
}
}
}
while(!jia_c);
if(jian_c==0)
{
delay(1000);
if(jian_c==0)
{
value_c--;
timer1=0;
if(value_c==0)
{
value_c=0;
}
}
}
while(!jian_c);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
value_v=5;
value_c=5;
Timer0Init(); //定时器0初始化
Timer1Init(); //定时器1初始化
value_v=5;
while(1)
{
keyscan();
}
}
/*******************************************************************************
* 函 数 名 : Time1
* 函数功能 : 定时器1的中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
TH1 = 0xFF;
TL1 = 0x9C; //0.1ms
timer=timer+1;
timer=timer%40;
if(timer <value_c)
{
PWM_c=1;
}
else
{
PWM_c=0;
}
}
//********************************************************************************************************************
void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
TH1 = 0xFF;
TL1 = 0x9C; //0.1ms
timer1=timer1+1;
timer1=timer1%40;
if(timer1 <value_v)
{
PWM_v=1;
}
else
{
PWM_v=0;
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1