智能车制作

标题: 同时运用51单片机的两个定时器中断对舵机和电机进行控制,高手帮忙 [打印本页]

作者: 华电小宁    时间: 2011-1-11 00:56
标题: 同时运用51单片机的两个定时器中断对舵机和电机进行控制,高手帮忙
同时运用51单片机的两个定时器中断对舵机和电机进行控制,就是产生两个不同占空比的方波,分别对舵机和电机进行控制,为什么运行之后舵机老是摇摆不定呢?感觉错误在于中断程序的优先级 但是怎么改呢 谢谢啦 很急
我的程序如下,
#include<regx51.h>         
#define uchar unsigned char
#define V_TH0 0XFF
#define V_TL0 0XB0 //记一次数为0.1ms
#define V_TH1 (65535-10000)>>8 //取高八位d8
#define V_TL1 (65535-10000)&0XFF //取低八位ef,记一次数为10ms
#define V_TMOD 0x11
#define pwm0max 200 //定义周期
#define pwm1max 200 //定义周期
sbit pwmout0=P3^6;//定义输出管角,控制舵机信号
sbit pwmout1=P3^7;//控制电机信号
sbit p00=P0^0;
void open0(void);
void open1(void);
void Delay(void);
uchar pwm0;
uchar pwm1;
uchar click=0;//定义宏观变量
void main(void)
{
open0();

while(1)
{ if(p00==0)
   pwm0=15,pwm1=30;
  else
   pwm0=20,pwm1=30;
}
}
void open0(void)         
{
TMOD=V_TMOD;//工作方式选择
TH0=V_TH0;
TL0=V_TL0;
TH1=V_TH1;
TL1=V_TL1;

ET0=1;//开定时器0中断
TR0=1;//开定时器0
ET1=1;//开定时器1中断
TR1=1;//开定时器1
EA=1;//开总中断
p00=0;
pwm0=15;
pwm1=30;
}
void open1(void)
{
TMOD=V_TMOD;  //0X
TH0=V_TH0;
TL0=V_TL0;
EA=1;//开总中断
ET1=1;//开定时器1中断
TR1=1;//开定时器1
}
void Delay(void)
{
unsigned int TemCyc=1000;
while(TemCyc--);
}
/*中断服务函数*/
void timer0(void) interrupt 1
{
EA=0;
TH0=V_TH0;
TL0=V_TL0;

click++;
if(click>=pwm0max)
  click=0;
if(click<pwm0)
  pwmout0=1;
else
  pwmout0=0;
  EA=1;
}
void timer1(void) interrupt 3
{
EA=0;
TH0=V_TH0;
TL0=V_TL0;

click++;
if(click>=pwm1max)
  click=0;
if(click<pwm1)
  pwmout1=1;
else
  pwmout1=0;
  EA=1;
}
作者: 华电小宁    时间: 2011-1-12 13:53
快来高人帮帮忙啊谢谢
作者: 华电小宁    时间: 2011-3-4 16:50
快来人啊
作者: lenglee    时间: 2011-3-6 21:21
你两个中断里面的计数click 一样,有冲突~ ·
作者: txan0630    时间: 2011-11-19 17:28
你的两个赋值付错了!
作者: 影动者    时间: 2012-3-22 17:25
单片机cpu只能同时对一个中断进行处理,是没法让两个定时器并行工作的
作者: 问乐寻音    时间: 2012-3-23 00:26
楼主你这是用51模拟10K的PWM吗?建议你把频率改成1K,51吃不消的。老在电机的中断里跑。或者把电机中断里的EA赋值去掉,留舵机中断里的EA应该就行了。
作者: I'M_Not_The    时间: 2013-1-26 12:32





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2