打印
[AVR单片机]

基于AVR单片机的三相spwm波(转)

[复制链接]
3216|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huamunv|  楼主 | 2010-6-17 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
相位差120,稍为整一下,也可以搞成变频
//包含所需头文件
#include <ioM16v.h>
#include <macros.h>


/*------宏定义------*/
#define uchar unsigned char
#define uint unsigned int
flash uchar SinParam[234]={  
127, 130, 133, 136, 139, 142, 145, 148, 152, 155, 158, 160, 163, 166, 169, 172, 175, 178, 180, 183,  
186, 188, 191, 194, 196, 199, 201, 203, 206, 208, 210, 212, 214, 216, 218, 220, 222, 223, 225, 227,  
228, 230, 231, 232, 233, 235, 236, 237, 237, 238, 239, 240, 240, 241, 241, 241, 242, 242, 242, 242,  
242, 242, 241, 241, 241, 240, 240, 239, 238, 237, 237, 236, 235, 233, 232, 231, 230, 228, 227, 225,  
223, 222, 220, 218, 216, 214, 212, 210, 208, 206, 203, 201, 199, 196, 194, 191, 188, 186, 183, 180,  
178, 175, 172, 169, 166, 163, 160, 158, 155, 152, 148, 145, 142, 139, 136, 133, 130, 127, 124, 121,  
118, 115, 112, 109, 106, 102, 99, 96, 94, 91, 88, 85, 82, 79, 76, 74, 71, 68, 66, 63,  
60, 58, 55, 53, 51, 48, 46, 44, 42, 40, 38, 36, 34, 32, 31, 29, 27, 26, 24, 23,  
22, 21, 19, 18, 17, 17, 16, 15, 14, 14, 13, 13, 13, 12, 12, 12, 12, 12, 12, 13,  
13, 13, 14, 14, 15, 16, 17, 17, 18, 19, 21, 22, 23, 24, 26, 27, 29, 31, 32, 34,  
36, 38, 40, 42, 44, 46, 48, 51, 53, 55, 58, 60, 63, 66, 68, 71, 74, 76, 79, 82,  
85, 88, 91, 94, 96, 99, 102, 106, 109, 112, 115, 118, 121, 124};  
// 234点正弦波样本值
//包含所需头文件
#include <ioM16v.h>
#include <macros.h>


/*------宏定义------*/
#define uchar unsigned char
#define uint unsigned int
uint x_SW =3,X_A =0, X_B =74; X_C=156;
//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB=0x08;
PORTC = 0x00;
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0xF0;
}
//定时器T0初始化
void timer0_init(void)
{
TCCR0  = 0x00;//停止定时器
TCNT0  = 0x00;//初始值
OCR0  = 0x7F;//匹配值
TIMSK |= 0x01;//中断允许
TCCR0  = 0x6E;//启动定时器
}

//T0溢出中断服务程序
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{

    X_C += x_SW;    // 新样点指针
  if (X_C> 234)
  X_C -=234; // 样点指针调整
    OCR0 = SinParam[X_C];  // 取样点指针到比较匹配寄存器
  
          TCNT0  = 0x00;//初始值

}

//定时T1初始化
void timer1_init(void)
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x04;//中断允许
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1AH = 0x00;
OCR1AL = 0x7F;//匹配A值
OCR1BH = 0x00;
OCR1BL = 0x7F;//匹配B值
ICR1H  = 0x00;
ICR1L  = 0x7F;//输入捕捉匹配值
TCCR1A = 0xA1;
TCCR1B = 0x0A;//启动定时器
}

//定时器T1溢出中断服务程序
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
    X_A += x_SW;    // 新样点指针
  if (X_A> 234) X_A -=234; // 样点指针调整
  OCR1AH  = 0x00;
            OCR1AL  = SinParam[X_A];//匹配A值
    X_B += x_SW;    // 新样点指针
  if (X_B> 234) X_B -=234; // 样点指针调整
  
  OCR1BH = 0x00;
            OCR1BL =SinParam[X_B];//匹配B值
  
  
         
TCNT1H = 0x00; //重装值高位
TCNT1L = 0x00; //重装值低位

}


//定时器T2初始化
void timer2_init(void)
{
TCCR2  = 0x00;//停止定时器
ASSR  = 0x00;//异步时钟模式
TCNT2  = 0x00;//初始值
OCR2  = 0x01;//匹配值
TIMSK |= 0x00;//中断允许
TCCR2  = 0x19;//启动定时器
}


void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR  = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR  = 0x00;
port_init();
timer0_init();
timer1_init();
timer2_init();
SEI();//开全局中断
}
//主函数
void main(void)
{
      init_devices();
        //TCCR2  = 0x6A;//启动定时器
  //OCR2=156;
  OCR0=128;
  TCNT0  = 0x00;//初始值
        TCNT2  = 0x00;//初始值
  TIMSK |= 0x40;//中断允许   
  SEI();    // 开放全局中断
//在这继续添加你的代码
while(1)
{

}
}
做过实物,只要你后级做的好,波形会很好看

相关帖子

沙发
jimoxinl| | 2010-6-18 12:25 | 只看该作者
留个印看那看那

使用特权

评论回复
板凳
xuetingxun2010| | 2010-6-18 20:50 | 只看该作者
嘿嘿,有价值

使用特权

评论回复
地板
麻辣鸭脖子| | 2010-6-18 23:05 | 只看该作者
解释得挺多的

使用特权

评论回复
5
qfengbj| | 2010-6-22 23:21 | 只看该作者
这个好,容易懂!

使用特权

评论回复
6
yidou| | 2010-6-23 21:55 | 只看该作者
踩踩,不错!

使用特权

评论回复
7
xiaohuai| | 2010-6-23 22:47 | 只看该作者
定时器初始化解释很详细

使用特权

评论回复
8
xuyiyi| | 2010-6-24 12:05 | 只看该作者
软件模拟版三相spwm波发生器,不错!

使用特权

评论回复
9
郑朝清| | 2016-11-30 21:16 | 只看该作者
还有一相跑哪去了?

使用特权

评论回复
10
yanhkzl| | 2018-5-14 11:35 | 只看该作者
很不错,学习学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

730

帖子

1

粉丝