📄 pwm.c
字号:
#include <avr/io.h>
#include <avr/signal.h>
#define stopnum 50000
#define delay_time 10000
#define stop_speed 250
unsigned int a,b=0;
unsigned int howlong=0 ;
void delay(unsigned int t)
{
for(;t;t--) ;
}
SIGNAL(SIG_INPUT_CAPTURE1)
{
TIMSK=00; //close capture interrupt
howlong++;
if(howlong==stopnum){PORTB=0X80;howlong=0;delay(65000);}
TIMSK=0X20; //open capture interrupt
}
void main (void)
{
DDRB=0Xff; //PORTB is setting on out and PB4 input
DDRD=0X20; //设置OC1A为输出
PORTB=0Xff;
TCCR1A=0x82; //OC1A(PD5) is "0",9 BITS PWM C3,10 bit PWM;c1,8 bit PWM
//0XC~ 初始电平为1;0X8~ 初始电平为0
TCCR1B=0X41; //上升捕获 ck/1
TCNT1=0; //初值
TIMSK=0X20; //open the capture interrupt捕捉中断开
//OCR1A=1000; //占空比=OCR1A/1023
SREG=0X80; //enable total interrupt
b=stop_speed;
//当PB4为高时,电机先刹车再短路停止,直到PB4为低;
//当PB4为低时,电机先加速后以最大速度匀速运动,直到PB4再次为高刹车停;
while(1)
{
if(PIND&0X01) //PB4为1,停
{
if(b>stop_speed) {b-=2;OCR1A=b;} //关PWM
if(b<=stop_speed)
{
delay(60000);
PORTB=0XFF; //减速到足够小时,关继电器
delay(50); //继电器动作延时
OCR1A=0;
}
}
else //PB4为0,电机转
{
PORTB&=0X00; //开继电器/电机
delay(50);
if(b<=506) //把占空比加到最大
{
b+=2;
OCR1A=b; //更新占空比
}
}
delay(5000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -