AVR EVB PWM正弦波产生程序

来源:互联网 发布:淘宝上的甩棍能碎砖吗 编辑:程序博客网 时间:2024/06/05 08:52

#ifndef _COMMON_H_
#define _COMMON_H_ 1

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h >
#include <avr/pgmspace.h>
#include <avr/delay.h>

#ifndef _DATA_TYPE_
#define _DATA_TYPE_ 1
#define uchar unsigned char
#define uint  unsigned int
#endif

#define FREQ 8

#ifndef _DELAYMS_
#define _DELAYMS_ 1
void DelayMs(uint ms)
{
 uint i;
 for(i=0;i<ms;i++)
  _delay_loop_2(FREQ *250);
}
#endif

void InitPort( void )
{
 DDRB  =  _BV(PB4);
 PORTB = _BV(PB4);
}

#endif

 

main.c

 


#include

const unsigned char SINA[128] PROGMEM ={
64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,
123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,
117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,
45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,
7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60
};

uchar  Step = 8;
uchar  Sum = 0;

SIGNAL( SIG_OVERFLOW0 )
{
 Sum+= Step; //
新样点指针
    if (Sum> 127) Sum-= 128; //
样点指针调整
     OCR0 = pgm_read_byte(SINA + Sum); //
取样点指针到比较匹配寄存器

}

void InitTimer( void )
{
 TCCR0 = 0x71; //
相位调整PWM模式,分频系数=1,正向控制OC0
    TIMSK=_BV(TOIE0); // T/C0
溢出中断允许
}

int main(void )
{
 InitPort();
 InitTimer();
 sei();
 while(1) ;
}

原创粉丝点击