📄 mega8_spwm.c
字号:
#include<avr/io.h>
#include<avr/sleep.h>
#include<avr/signal.h>
#include<avr/interrupt.h>
#define BYTE unsigned char
#define WORD unsigned int
#define PWMOUTA PB1
#define PWMOUTB PB2
#define PWMOUTC PB3
int ocr_reg=0xfe;
char flag=0x00;
/************初始化程序**************/
void spwm_init(void)
{
PORTB|=(1<<PWMOUTA)|(1<<PWMOUTB); //把PWM置为输出
DDRB |=(1<<PWMOUTA)|(1<<PWMOUTB);
TIMSK=0x00;
TCCR1B = 0x00; //stop
TCNT1 = 0x0000; //计数器初值
OCR1A = 0x00ff; //比较寄存器的值,来控制占空比 (占空比50%)
OCR1B = 0x0000; //(占空比50%)
ICR1 = 0x03ff; //捕捉寄存器的值 10位分辨率
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11);//|(1<<WGM10);
//设置PWM的频率及PWM工作模式
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);//|(1<<CS11);
//快速PWM模式,时钟不分频,TOP由ICR1设定
TIMSK|=(1<<OCIE1A); //允许计数器比较匹配中断
PORTB|=(1<<PWMOUTC);
DDRB |=(1<<PWMOUTC);
TCCR2=0x69; //设置PWM的频率及PWM工作模式
TCNT2=0x00; //计数器初值
OCR2 =0x7f; //比较寄存器的值,来控制占空比
}
/************中断服务程序**************/
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
// memcpy_P(ocr_reg,sin_table+i,1);//从Flash中取出正弦数据
OCR1A=ocr_reg;//更新OCR1A
OCR1B=ocr_reg;//更新OCR1B
// OCR2 =ocr_reg;//更新OCR2
// i++;//指向下一个数据
if(flag)
ocr_reg--;
if(!flag)
ocr_reg++;
if(ocr_reg==0x03ff)
// ocr_reg=0x00;
flag=0x01;
if(ocr_reg==0x00)
// ocr_reg=0x00;
flag=0x00;
}
/****************主程序**************/
int main(void)
{
cli();
spwm_init(); //初始化
MCUCR = 0x00;
GICR = 0x00;
set_sleep_mode(SLEEP_MODE_IDLE); //设置休眠模式为空闲模式
sei(); //开总中断允许
while(1)
{
;
sleep_mode(); //进入休眠状态
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -