基于avr单片机I/O口输出SPWM程序

发布者:心语乐章最新更新时间:2015-07-06 来源: 51hei关键字:avr单片机  IO口输出  SPWM 手机看文章 扫描二维码
随时随地手机看文章
基于ATmega16单片机输出SPWM程序,PWM频率为25KHZ,输出正弦波为50HZ,输出电压波形光滑,失真度小,只需要硬件和软件相结合。电路简单,只修改程序就可以调整功能,成本低,可靠性主高。 

#include  
#include  
#define BIT(x) (1< //周期为20ms,产生50HZ的交流电,spwm频率为20k  
const unsigned char list[]={1,4,7,10,13,16,19,22,25,28,31,34,37,39,42,45,48,51,54,57,60,62,  
65,68,71,74,76,79,82,84,87,90,92,95,97,100,103,105,108,110,112,115,117,119,  
122,124,126,128,131,133,135,137,139,141,143,145,147,149,151,152,154,156,157,  
159,161,162,164,165,167,168,169,171,172,173,174,176,177,178,179,180,181,182,  
182,183,184,185,185,186,186,187,187,188,188,189,189,189,189,189,189,189,189,  
189,189,189,189,189,189,188,188,187,187,186,186,185,185,184,183,182,182,181,  
180,179,178,177,176,174,173,172,171,169,168,167,165,164,162,161,159,157,156,  
154,152,151,149,147,145,143,141,139,137,135,133,131,128,126,124,122,119,117,  
115,112,110,108,105,103,100,97,95,92,90,87,84,82,79,76,74,71,68,65,62,60,57,  
54,51,48,45,42,39,37,34,31,28,25,22,19,16,13,10,7,4,1};  
//周期为20ms,产生50HZ的交流电,spwm频率为20k  
int count,zf=0;  
void port_init(void)   
{  
PORTB = 0x00;  
DDRB  = 0xFF;//b口输出  
PORTC = 0x00;   
DDRC  = 0xFF;//c口输出  
PORTD = 0x00;  
DDRD  = 0xFF;//d口输出   
}  
//TIMER1 initialize - prescale:1  
// WGM13:0=10) PWM phz correct, TOP= ICR1  
// desired value: 10KHz  
// actual value: 10.000KHz (0.0%)  
void timer1_init(void)  
{  
TCCR1B = 0x00; //stop                                                                      
TCNT1H = 0xFF; /tup  
TCNT1L = 0x38;  
OCR1AH = 0x00;  
OCR1AL = 0xC8;  
OCR1BH = 0x00;  
OCR1BL = 0xC8;   
ICR1H  = 0x00;  
ICR1L  = 200;//    载波周期为50us              
TCCR1A = 0xA2; //10100010 top时更新OCR1A OCR1B,向上计数比较匹配清零,反之置位  
TCCR1B = 0x11; //start Timer 00010001  clk无分频,相位修正PWM  
TIMSK |= 0x20; //timer interrupt sources使能捕捉中断  
}  

//#pragma interrupt_handler timer1_capt_isr:7  
ISR(TIMER1_CAPT_vect)  
 

{   OCR1A=500;   OCR1B=500;  

if(zf)                                  

{  

  if(count<200)  
  {  
    if(count==1)       //此时2#管子才关断  
    {  
      //PORTB &= ~BIT(3);    //3#管子已经关断  
      PORTB |= BIT(4);     //开通4#管子  
    }  
  OCR1A=list[count++];     //开通1#管子  
  }  
  else if((count>=200)&&(count<400))  
  {  
    if(count==200)       
    {  
      PORTB &= ~BIT(4);    //关断4#管子  
    }  
    if(count==201)     //此时1#管子才关断  
    {  
       PORTB |= BIT(3);    //开通3#管子  
    }  
    OCR1B=list[count++-200];  //开通2#管子  
  }           else     {  
    count=0;      //2#管子已经关断  
    PORTB &= ~BIT(3);    //关断3#管子  
    //PORTB |= BIT(4);    //开通4#管子  
    OCR1A=list[count++];   //开通1#管子  
  }     }     else;   }  

//call this routine to initialize all peripherals  
void init_devices(void)  
{  
//stop errant interrupts until set up  
cli(); //disable all interrupts  
port_init();  
timer1_init();  

sei(); //re-enable interrupts  
//all peripherals are now initialized  
}  
// 主函数
int main(void)  
{  
init_devices();  
//insert your functional code here...  
 

zf = 1;   OCR1A=500;   OCR1B=500;   PORTB = 0;   while(1);  

}  

关键字:avr单片机  IO口输出  SPWM 引用地址:基于avr单片机I/O口输出SPWM程序

上一篇:AVR单片机从左到右LED流水灯C语言程序
下一篇:基于单片机的简易多通道虚拟示波器的设计

推荐阅读最新更新时间:2024-03-16 14:24

AVR单片机串口详解
一.熟悉AVR单片机UART资源,首先从波特率和帧说起 波特率:与51不同有单独的波特率发生器,不需要定时器来产生,节省了资源 波特率计算公式,这里我采用IccAVR的配置功能,直接计算生成 单片机支持的模式:异步正常模式,异步倍数模式,和同步模式,一般选第一种模式 帧格式:起始位+数据位(5-9位可选)+校验位(可选)+停止位(1、2位) 空闲 o ********* P 1 1 通讯电路空闲时为高电平 二、大概了解了下硬件资源后,就要了解软硬件的桥梁 寄存器了
[单片机]
基于AVR单片机的USB 0TG主从机系统设计
0 引言 随着PDA、移动电话、数码相机、打印机等消费类产品的普及,用于这些设备与电脑、或设备与设备之间的高速数据传输技术越来越受到人们的关注。以往以计算机为核心的数据传输结构,非常不利于USB,总线在嵌入式行业的应用,也不适用于野外作业,而OTG技术的推出则可实现在没有PC的情况下,设备与设备之间的数据传输,它拓展了USB技术的应用范围。本文采用的设计方案是基于Philips公司的ISP1362 OTG控制芯片,参照最新的USB OTG技术规范,设计了一种遵循USB协议的主/从机系统。 1 ISP1362芯片的内部结构 Philips公司的ISP1362是一款符合USB 2.0总线协议的接口芯片,内部有3个USB控制器一
[单片机]
基于<font color='red'>AVR单片机</font>的USB 0TG主从机系统设计
嵌入式学习笔记17——AVR单片机之头文件简介和使用
1. ICCAVR的头文件形式为: #include io*v.h 芯片使用的不是mega类;或#include iom*v.h 使用的芯片为mega类。其中 * 用相应的芯片型号代替,如芯片ATmega8,则头文件为#include iom8v.h 2. 在AVR单片机的使用中有一个重要的头文件,macros.h,该头文件定义了一些常用的宏,如BIT(X),以及看门狗复位,开/关全局中断等等。 3. AVR单片机的位操作:AVR中没有像51单片机中sbit的用法,但是同样可对单个I/O口进行操作,其具体方法如下: DDRB | =(1 3); DDRB | =BIT(3); DDRB | =BIT(DDR
[单片机]
AVR单片机应用经验
AVR与传统类型的单片机相比,除了必须能实现原来的一些基本的功能,其在结构体系、功能部件、性能和可靠性等多方面有很大的提高和改善。   但使用更好的器件只是为设计实现一个好的系统创造了一个好的基础和可能性,如果还采用和沿袭以前传统的硬件和软件设计思想和方法的话,是不能用好AVR的,甚至也不能真正的了解AVR的特点和长处。   功能越好的器件,需要具备更高技术和能力的人来使用和驾驭它。就象一部好的F1赛车,只有具备高超技术的驾驶员才能充分体会到车的特点,并能最大限度的发挥出车的性能。   AVR具有上手入门快,开发方便简单的特点,但要充分体会和发挥AVR的优点,还需要应用工程师本身的硬软件设计开发能力的不断学习、实践提高。
[单片机]
AVR单片机nRF24L01发送接收驱动程序
#include iom16v.h #include macros.h #include 12864.h //------------------------------------------------------------------------------ //spi标志 #define DDR_SPI DDRB #define DD_MOSI 5 #define DD_MISO 6 #define DD_SCK 7 #define DD_SS 4 #define CE PB3 #define IRQ PB2 //--------------------------------NRF24L01接口定义------
[单片机]
51,PIC,AVR单片机的对比
1. 传统51 传统51,我想我就不多说了,适合菜鸟入门,容易上手,价格一般(从性价比方面说)。 缺点:解密容易(传统51说:谁让咱出道早呢,大家都研究我,哎!哭......)一般功能也有,, 但AD、eeprom等功能要靠扩展,增加硬件和软件负担。 IDE环境推荐 keil。 2. PIC PIC的好处就是各个型号的兼容性强,学好了PIC16f877a,16系列的就OK了,别的型号要用的时候拿出2分钟看看数据手册就行了。12系列,16系列,18系列也是充分的向下兼容。功能全,型号多,适于选型分析,抗干扰能力强 缺点:解密容易(pic说:我出道也很早啊,人家也研究我不少年了,我和奥尼
[单片机]
介绍双极性SPWM控制的特点
1.概述: 本文介绍双极性SPWM控制的特点,双极性控制都是高频开关,没有工频开关。Q1,Q2同步开关,Q3,Q4同步开关。 2.双极性控制: 双极性控制的三角载波是有正有负和单极性控制的主要区别在于,双极性有个直流偏置。 双极性控制驱动: Q1,Q2驱动和驱动占空比包络: Q3,Q4驱动和驱动占空比包络: 桥臂中点电压和桥臂中点平均电压: 从桥臂中点电压可以看出双极性控制方法是两电平,输出的电平为±Vbus,Part1提到的单极性控制是三电平的,输出的电平为±Vbus 和 0 。 电感电压和 电容 电压: 从电感的电压波形可以看出双极性调制的应力比单极性调制的电感应力高。 小结: 损耗方面双极性
[嵌入式]
介绍双极性<font color='red'>SPWM</font>控制的特点
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved