|
出现的状况是:
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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|