• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

直流电机pwm调速

我使用avr单片机M16的T0作直流电机pwm调速,要设定电机在规定的时间内转与停,应该怎么办?
是否是在其PWM中断中给予计时的限制?
static  long time;
struct PUMP_DATA{

  unsigned long pump_pwm;
  unsigned long pump_time;
};
#pragma vector=TIMER1_COMPB_vect
__interrupt void timer1(){
//0.005s
  time++;
  if(time>=pump_p->pump_time){
  DDRD_DDD4=0;
  OCR1B=0;
  }
void pump_bsp(struct PUMP_DATA *p_pump){
  TCCR1A=0X20;
  TCCR1B=0X11;
  DDRD_DDD4=1;
  ICR1=16000;
  OCR1B=p_pump->pump_pwm;
  }
void main()

{ OSCCAL=0xA7;//8mhz校正
  pump_p->pump_pwm=8000;
  pump_p->pump_time=600;
  pump_bsp(pump_p);

}
为什么停不了?
请指正!
全部回复(2)
正序查看
倒序查看
zxjtam
LV.1
2
2005-10-08 11:09
/*前段时间在此处发表了关于直流电机pwm调速时间的控制的一个帖子,现已经改好,并测试通过
现修改后贴出来!
IAR软件编程
*/
#include
#include
#include

static  long time;
struct PUMP_DATA {

  unsigned long pump_pwm;
  unsigned long pump_time;
};
struct PUMP_DATA pumdate,*pump_p=&pumdate;
#pragma vector=TIMER1_OVF_vect  //应该改成这个中断0.005s
__interrupt void timer1(){
  time++;
  if(time>=pump_p->pump_time)
  {
  DDRD_DDD4=0;
  OCR1B=0;
  }
}
void pump_bsp(struct PUMP_DATA *p_pump)
{
  DDRD_DDD4=1;
  OCR1B=p_pump->pump_pwm;
  }
void init_time1()
{
   TCCR1A=0X20;
   TCCR1B=0X11;
   ICR1=20000;
   TIMSK=TIMSK|(1<   __enable_interrupt();
}
void main()

{ OSCCAL=0xA7;   //8MHZ频率校正

  pump_p->pump_pwm=19000;  //PWM占空比
  pump_p->pump_time=12000; //定时运行的时间 1分钟
  init_time1();
  pump_bsp(pump_p);

}
0
回复
fakir
LV.2
3
2005-10-12 22:24
@zxjtam
/*前段时间在此处发表了关于直流电机pwm调速时间的控制的一个帖子,现已经改好,并测试通过现修改后贴出来!IAR软件编程*/#include#include#includestatic  longtime;structPUMP_DATA{  unsignedlongpump_pwm;  unsignedlongpump_time;};structPUMP_DATApumdate,*pump_p=&pumdate;#pragmavector=TIMER1_OVF_vect  //应该改成这个中断0.005s__interruptvoidtimer1(){  time++;  if(time>=pump_p->pump_time)  {  DDRD_DDD4=0;  OCR1B=0;  }}voidpump_bsp(structPUMP_DATA*p_pump){  DDRD_DDD4=1;  OCR1B=p_pump->pump_pwm;  }voidinit_time1(){  TCCR1A=0X20;  TCCR1B=0X11;  ICR1=20000;  TIMSK=TIMSK|(1pump_time=12000;//定时运行的时间1分钟  init_time1();  pump_bsp(pump_p);}
兄弟什么公司的?
0
回复