xuetingxun2010 发表于 2009-8-24 20:41:46

在唤醒睡眠模式时,出现的问题

出现的状况是:
1.在进入睡眠模式后,本想将电机停转,可是有时候电机会在全电压的情况下运行。(我使用u2003驱动电机,PD7输出pwm波)
2。指示灯提示已经进入睡眠模式了。
/*====================================================================
本次实验,没有很好的实现。在占空比比较小的时候,效果还是可以的,但是
        不精确,这样就使得没法继续下去了。这只能是用来做实验了,如果用到比赛
        中,肯定会出乱子的。原因没有找到!
使用芯片:mega16
晶振:内部8mhz
       
=======================================================================*/
#include<iom16v.h>
#include<macros.h>
#pragma interrupt_handler int1_:3
#pragma interrupt_handler capture_1:6
#define pwm OCR2//pwm波周期为255
#define uchar unsigned char
#define uint unsigned int
const unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80
                                                                                                                        ,0x98};//共阴数码管段码
unsigned int num=0,speed_now;
void delay_ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
          for(j=0;j<1141;j++);
}
//=================================================
void sleep_mode()//睡眠模式函数
{

MCUCR=BIT(SM1);//设定为掉电模式
MCUCR|=BIT(SE);//sleep必须紧跟其后
asm("sleep");//进入睡眠状态
}
//====================================================
void timer1_init()
{
TCNT1H=0;
TCNT1L=0;
TCCR2|=BIT(WGM20)|BIT(COM21)|BIT(CS20);
TCCR1B|=BIT(ICNC1);
}
//======================================================
void port_init()
{
DDRA=0XFF;
DDRC=0XFF;
DDRD|=BIT(PD7);
DDRD&=~BIT(PD6);
DDRB=0XFF;
PORTB=0XFF;
}
//===================================================
void display(int num1,int num2)
{
            PORTC=0;//开显示
       PORTA=~table;//显示待测转速千位
       delay_ms(2);
       PORTC=1;//开显示
       PORTA=~table;//显示待测转速百位
       delay_ms(2);
       PORTC=2;//开显示
       PORTA=~table;//显示待测转速十位
       delay_ms(2);
       PORTC=3;//开显示
       PORTA=~table;//显示待测转速个位
       delay_ms(2);
       PORTC=4;//开显示
       PORTA=~table;//显示设置转速千位
       delay_ms(2);
       PORTC=5;//开显示
       PORTA=~table;//显示设置转速百位
       delay_ms(2);
       PORTC=6;//开显示
       PORTA=~table;//显示设置转速十位
       delay_ms(2);
       PORTC=7;//开显示
       PORTA=~table;//显示设置转速个位
       delay_ms(2);
}       
//========================================================
void main()
{
unsigned int i,j;
port_init();
timer1_init();
MCUCR|=BIT(ISC11);//外部中断下降沿触发
GICR|=BIT(INT1);//使能外部中断1
TIMSK|=BIT(TICIE1);//输入捕获使能
SREG|=BIT(7);
TCCR1B|=BIT(CS11);//定时器1,8分频
while(1)
{
PORTB=0XFF;
        TCCR1B=0;//进入掉电模式之前,确保没有pwm波输出。
sleep_mode();
        pwm=150;
for(i=0;i<150;i++)
          display(speed_now,0);   
}

}
void int1_()//只是用来唤醒mcu
{
TCCR1B|=BIT(CS11);
PORTB=0XF0;//指示已经进入中断了
}
void capture_1()//用来测速的,在这个函数中没有什么意义。
{
speed_now=1000000/ICR1;
TCNT1H=0;
TCNT1L=0;
}

xuetingxun2010 发表于 2009-8-25 09:19:04

还请各位浏览者给点建议。谢谢。这个问题已经困扰我好几天了。

machao 发表于 2009-8-25 15:25:07

在进入睡眠模式前,把PWM的定时器关闭还不够,还要把PWM输出脚清零。

xuetingxun2010 发表于 2009-8-28 20:49:00

谢谢马老师在百忙中看了我程序,并且给了我建议。可是我把程序改了,
while(1)
{
PORTB=0XFF;
pwm=0;
TCCR1B=0;//进入掉电模式之前,确保没有pwm波输出。
sleep_mode();
pwm=150;
for(i=0;i<150;i++)
    display(speed_now,0);   
}
结果还是一样,仍是有时候能使电机停转,有时候以全速转动。还请各位浏览者给点建议。谢谢
页: [1]
查看完整版本: 在唤醒睡眠模式时,出现的问题