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

📄 final1.c

📁 spwm波形发生程序
💻 C
字号:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
#include <avr/bit.h>

#define  Dis_port   PORTB
#define  Alert_io     PB2
#define  Work_io      PB3

#define  Pwm_port   PORTA
#define  Posi_io      PA0
#define  Nega_io      PA1

#define  Key_port   PORTD
#define  Key_int0     PD2

uint16_t  ADC_rel = 0, flag = 1;

/*****************************************************

    SPWM调制波形表.

*****************************************************/
uint8_t sintab[] =               //spwm波形延时时间表
{
        1,  1,  1,  1,  1,  1,  2,  2,  2,  3,
        3,  3,  4,  4,  5,  5,  6,  7,  7,  8,
        9,  9, 10, 11, 12, 13, 14, 15, 16, 17, 
       18, 19, 20, 21, 23, 24, 25, 27, 28, 29,
       31, 32, 34, 35, 37, 38, 40, 41, 43, 45,
       46, 48, 50, 52, 53, 55, 57, 59, 61, 63,
       64, 66, 68, 70, 72, 74, 76, 78, 80, 82,
       85, 87, 89, 91, 93, 95, 97, 99,102,104,
      106,108,110,113,115,117,119,121,124,126,
      128,130,132,135,137,139,141,143,146,148,
      150,152,154,157,159,161,163,165,167,169,
      171,174,176,178,180,182,184,186,188,190,
	  192,193,195,197,199,201,203,204,206,208,
      210,211,213,215,216,218,219,221,222,224,
      225,227,228,229,231,232,233,235,236,237,
      238,239,240,241,242,243,244,245,246,247,
      247,248,249,249,250,251,251,252,252,253,
      253,253,254,254,254,255,255,255,255,255,
      255,255,255,255,255,255,254,254,254,253,
      253,253,252,252,251,251,250,249,249,248,
      247,247,246,245,244,243,242,241,240,239,
      238,237,236,235,233,232,231,229,228,227,
      225,224,222,221,219,218,216,215,213,211,
      210,208,206,204,203,201,199,197,195,193,
      192,190,188,186,184,182,180,178,176,174,
      171,169,167,165,163,161,159,157,154,152,
      150,148,146,143,141,139,137,135,132,130,
      128,126,124,121,119,117,115,113,110,108,
      106,104,102, 99, 97, 95, 93, 91, 89, 87,
       85, 82, 80, 78, 76, 74, 72, 70, 68, 66,
       65, 63, 61, 59, 57, 55, 53, 52, 50, 48,
       46, 45, 43, 41, 40, 38, 37, 35, 34, 32,
       31, 29, 28, 27, 25, 24, 23, 21, 20, 19,
       18, 17, 16, 15, 14, 13, 12, 11, 10,  9,
        9,  8,  7,  7,  6,  5,  5,  4,  4,  3,
        3,  3,  2,  2,  2,  1,  1,  1,  1,  1,
};

void Delay(uint32_t i)
{
	while (i)
		{
			i--;
		}
}
/**********************************************

     停止程序
     
*************************************************/
void Sys_stop(void)
{
    Pwm_port = 0xFF;
    DDRA  = 0x00;
    cbi(Pwm_port, Nega_io);
    cbi(Pwm_port, Posi_io);
    Dis_port = 0xFF;
    DDRB  = 0x00;
}
/**********************************************

    开始程序
    
**********************************************/
void Sys_start(void)
{
    Pwm_port = 0xFF;
    DDRA  = 0x7F;
   
    Dis_port = 0xF7;
    DDRB  = 0x0F;
}

void KEY(uint8_t f)

{
	switch (f)
		{
			case 1: Sys_stop(); break;
			case 0: Sys_start();break;
		}
}
/***********************************************

    模数检测,电压检测,低压报警
	
***********************************************/
void ADC_tst(void)                                           //低压报警查询延时
{
   uint16_t i;
   
	for (i=0; i<1; i++)
	{
	    if (ADC_rel < 512)                                     //电压低于设定正常电压报警灯亮
	        {
			    cbi(Dis_port, Alert_io);
	        } 
	  
	    if (ADC_rel >= 512)                                     //电压正常
			{
				sbi(Dis_port, Alert_io);
			}
	  
	    if (ADC_rel <= 300)                                   //电压过低,停止工作
			{
				Sys_stop();
			}
	}
}

/**********************************************

    SPWM脉宽调制

**********************************************/
void spwm(void)
{ 
    uint16_t i, j, k; 
  
    cbi(Dis_port, Work_io);    //工作模式初始化,报警灯灭,工作灯亮
  
    for (;;)
        {                                 //SPWM波循环输出,由查表实现
		   KEY(flag);
		   for (j=0; j<360; j++)
			{
				cbi(Pwm_port, Posi_io);
				for (i=0; i<sintab[j]; i++)
				    {
					    ADC_tst();
				    }
			
				sbi(Pwm_port, Posi_io);
				for (k=0; k<(256-sintab[j]); k++)
				    {
					    ADC_tst();
					}
            }
	
		   for (j=0; j<360; j++)
			{
				cbi(Pwm_port, Nega_io);
				for (i=0; i<sintab[j]; i++)
				    {
						ADC_tst();
					}
			
				sbi(Pwm_port, Nega_io);
				for (k=0; k<(256-sintab[j]); k++)
					{
						ADC_tst();
					}
			}
	    }
}

/**************************************************
  
    外部中断, 系统初始化

**************************************************/
 void init_sys(void)
{
	
    Pwm_port = 0xFF;                                          //波形输出口初始化
    DDRA  = 0x7f;
   
    Dis_port = 0xFF;                                          //二极管显示口初始
    DDRB  = 0x0F;
   
    PORTD = 0xFF;                                             //按键口初始
    DDRD  = 0x00;
   
    MCUCR = 0x02;                                                    //初始外部中断
    SREG  = 0x80;
    GICR  = 0x40;
   
}

/**************************************************

   低压检测 模数转换

**************************************************/
void ADC_Init(void)                                               //AD初始化
{
    ADMUX  = 0xc7;
    ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}

SIGNAL(SIG_ADC)                                                //AD中断服务程序
{
	
	uint16_t h = 0, l = 0;
	l = ADCL;
	h = ADCH;	
	ADC_rel = (h<<8) + l;	
	
}


/***********************************************

    按键中断服务程序
    
***********************************************/
SIGNAL(SIG_INTERRUPT0)
{
  	Delay(5000);
	if (flag == 0)
  	    {
		    flag = 1;
  	    }
  	    else if (flag == 1)
			{
				flag = 0;
			}
}

/********************************************

  主函数
  
********************************************/  
int main(void)
{
	
    init_sys();   //系统初始化
    ADC_Init();   //AD初始化
    spwm();        //波形输出
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -