搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 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[num1/1000];//显示待测转速千位
         delay_ms(2);
         PORTC=1;//开显示
         PORTA=~table[num1/100%10];//显示待测转速百位
         delay_ms(2);
         PORTC=2;//开显示
         PORTA=~table[num1/10%10];//显示待测转速十位
         delay_ms(2);
         PORTC=3;//开显示
         PORTA=~table[num1%10];//显示待测转速个位
         delay_ms(2);
         PORTC=4;//开显示
         PORTA=~table[num2/1000];//显示设置转速千位
         delay_ms(2);
         PORTC=5;//开显示
         PORTA=~table[num2/100%10];//显示设置转速百位
         delay_ms(2);
         PORTC=6;//开显示
         PORTA=~table[num2/10%10];//显示设置转速十位
         delay_ms(2);
         PORTC=7;//开显示
         PORTA=~table[num2%10];//显示设置转速个位
         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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2009-8-25 09:19:04 | 显示全部楼层
还请各位浏览者给点建议。谢谢。这个问题已经困扰我好几天了。

出0入0汤圆

发表于 2009-8-25 15:25:07 | 显示全部楼层
在进入睡眠模式前,把PWM的定时器关闭还不够,还要把PWM输出脚清零。

出0入0汤圆

 楼主| 发表于 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);     
}
结果还是一样,仍是有时候能使电机停转,有时候以全速转动。还请各位浏览者给点建议。谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 20:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表