⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 avr常用功能程序中包含了pwm、adc、中断、定时、i2c等各程序可供开发者直接使用
💻 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 + -