历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2019年10月21日 | ATmega2560单片机12路PWM输出的程序 每路PWM可独立控制

发布者:幸福花开 来源: 51hei关键字:ATmega2560  单片机  PWM输出  独立控制 手机看文章 扫描二维码
随时随地手机看文章

PWM模块设计说明:

使用ATmega2560单片机开发一个12路PWM输出的程序,要求每路PWM可以独立控制。通过串口指令控制某路PWM输出某个频率值(具体通道受指令第一字节控制),每路PWM的频率范围能在20-2000HZ范围内变化(具体频率值受指令第二字节控制),同时,还能够随时停止某路的输出。

指令要求:

A1  XX   第一路PWM连续输出占空比为50%不变的方波

(XX为00时,停止输出,为01~FF时,输出20~2000HZ频率值,其中重点关照1000HZ以下,以5HZ为步进;1000-2000HZ以15HZ步进即可,以上要求的步进值并非十分严格,如果不易实现,可以稍微修改。)  

以下均相同要求:

A2  XX   第二路。。。。

A3  XX   第三路。。。。

...............

AC  XX   第十二路。。。。

初始上电时,各路均不输出。


avr单片机源程序:

#include "kernel.h"


unsigned int PWM_Buf[6];//6路PWM频率


unsigned long timer0_ticks;

unsigned long timer0_tickssec;

unsigned long timer1_ticks;

unsigned long timer1_ticksmin;

unsigned long timer2_ticks;

unsigned long timer2_tickssec;

unsigned long timer3_ticks;

unsigned long timer3_ticksmin;

unsigned long timer4_ticks;

unsigned long timer4_ticksmin;

unsigned long timer5_ticks;

unsigned long timer5_ticksmin;


void Timer0_Init(void)

{

    timer0_ticks = 0;

    timer0_tickssec = 0;


    TCCR0A = 0x00;

    TCCR0B = 0x00;

    TCNT0 = 0x00;

    OCR0A = F_CPU/(1024-1)/20;//频率F_PWM

    OCR0B = OCR0A/2;//占空比50%

    //TCCR0A = 0xA3;  //COM0A1 COM0A0 COM0B1 COM0B0 – – WGM01 WGM00

    TCCR0B = 0xCD;  //FOC0A FOC0B – – WGM02 CS02 CS01 CS00

    /*

    TCCR0A = 0x00;

    TCCR0B = 0x00;//stop

    TCNT0  = 0xE7;//25us

    OCR0A  = 0x18;

    OCR0B  = 0x18;

    TCCR0A = 0x03;

    TCCR0B = 0x02;//start,clkT0S/8

    TIMSK0|= 0x01;//enable 0verflow interrupt*/

}


void TC0_Set_PWM(unsigned int curF)

{//20~80为clkT0S/1024,80~300为clkT0S/256,300~2000为clkT0S/64

    if(curF==0)

    {

        OCR0A = 0;

        OCR0B = 0;

        TCCR0A = 0;

    }

    else if((curF>=20)&&(curF<80))

    {

        OCR0A = F_CPU/(1024-1)/curF;

        OCR0B = OCR0A/2;

        TCCR0A = 0xA3;

        TCCR0B = 0xCD;

    }

    else if((curF>=80)&&(curF<300))

    {

        OCR0A = F_CPU/(256-1)/curF;

        OCR0B = OCR0A/2;

        TCCR0A = 0xA3;

        TCCR0B = 0xCC;

    }

    else if((curF>=300)&&(curF<=2000))

    {

        OCR0A = F_CPU/(64-1)/curF;

        OCR0B = OCR0A/2;

        TCCR0A = 0xA3;

        TCCR0B = 0xCB;

    }

}


void Timer1_Init(void)

{

    unsigned int temp;


    timer1_ticks = 0;

    timer1_ticksmin = 0;


    TCCR1A = 0x00;

    TCCR1B = 0x00;

    TCCR1C = 0x00;

    TCNT1H = 0x00;

    TCNT1L = 0x00;

    temp = F_CPU/16/20;

    OCR1A=temp;

    //temp = temp/2;

    //OCR1B=temp;

    //OCR1C=temp;

    //TCCR1A=(0<    TCCR1B=(1<    /*

    TCCR1A = 0x00;//COM1A1 COM1A0 COM1B1 COM1B0 COM1C1 COM1C0 WGM11 WGM10

    TCCR1B = 0x00;//stop,ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10

    TCCR1C = 0x00;//FOC1A FOC1B FOC1C – – – – –

    TCNT1H = 0xE3;

    TCNT1L = 0xE0;

    OCR1AH = 0x1C;

    OCR1AL = 0x1F;

    OCR1BH = 0x1C;

    OCR1BL = 0x1F;

    OCR1CH = 0x1C;

    OCR1CL = 0x1F;

    ICR1H  = 0x00;

    ICR1L  = 0x00;

    TCCR1B = 0x05;

//    TIMSK |= 0x04;//enable 0verflow interrupt*/

}


void TC1_Set_PWM(unsigned int curF)

{

    unsigned int temp;


    if(curF==0)

    {

        //OCR1A = 0;

        //OCR1B = 0;

        TCCR1A=0;

    }

    else if((curF>=20)&&(curF<=2000))

    {

        temp = F_CPU/16/curF;

        OCR1A=temp;

        TCCR1A=(0<    }

}


void Timer2_Init(void)

{

    timer2_ticks = 0;

    timer2_tickssec = 0;


    TCCR2A = 0x00;

    TCCR2B = 0x00;

    TCNT2 = 0x00;

    OCR2A = F_CPU/(1024-1)/20;//频率F_PWM

    OCR2B = OCR2A/2;//占空比50%

    //TCCR2A = 0xA3;  //COM2A1 COM2A0 COM2B1 COM2B0 – – WGM21 WGM20

    TCCR2B = 0xCF;  //FOC2A FOC2B – – WGM22 CS22 CS21 CS20


//    TCCR2 = 0x00;//stop,FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20

//    TCNT2 = 0xB8;//set count 10ms

//    OCR2  = 0x47;

//    TCCR2 = 0x05;//start,clkT0S/1024

//    TIMSK|= 0x40;//enable 0verflow interrupt

}


void TC2_Set_PWM(unsigned int curF)

{//20~80为clkT0S/1024,80~300为clkT0S/256,300~2000为clkT0S/64

    if(curF==0)

    {

        OCR2A = 0;

        OCR2B = 0;

        TCCR2A = 0;

    }

    else if((curF>=20)&&(curF<80))

    {

        OCR2A = F_CPU/(1024-1)/curF;

        OCR2B = OCR2A/2;

        TCCR2A = 0xA3;

        TCCR2B = 0xCF;

    }

    else if((curF>=80)&&(curF<300))

    {

        OCR2A = F_CPU/(256-1)/curF;

        OCR2B = OCR2A/2;

        TCCR2A = 0xA3;

        TCCR2B = 0xCE;

    }

    else if((curF>=300)&&(curF<=2000))

    {

        OCR2A = F_CPU/(64-1)/curF;

        OCR2B = OCR2A/2;

        TCCR2A = 0xA3;

        TCCR2B = 0xCC;

    }

}


void Timer3_Init(void)

{

    unsigned int temp;


    timer3_ticks = 0;

    timer3_ticksmin = 0;


    TCCR3A = 0x00;

    TCCR3B = 0x00;

    TCCR3C = 0x00;

    TCNT3H = 0x00;

    TCNT3L = 0x00;

    temp = F_CPU/16/20;

    OCR3A=temp;

    //temp = temp/2;

    //OCR3B=temp;

    //OCR3C=temp;

    //TCCR3A=(0<    TCCR3B=(1<    /*

    TCCR3A = 0x00;//COM3A1 COM3A0 COM3B1 COM3B0 COM3C1 COM3C0 WGM31 WGM30

    TCCR3B = 0x00;//stop,ICNC3 ICES3 – WGM33 WGM32 CS32 CS31 CS30

    TCCR3C = 0x00;//FOC3A FOC3B FOC3C – – – – –

    TCNT3H = 0xE3;

    TCNT3L = 0xE0;//set count 1s

    OCR3AH = 0x1C;

    OCR3AL = 0x1F;

    OCR3BH = 0x1C;

    OCR3BL = 0x1F;

    OCR3CH = 0x1C;

    OCR3CL = 0x1F;

    ICR3H  = 0x00;

    ICR3L  = 0x00;

    TCCR3B = 0x05;//start,clkT0S/1024

//    ETIMSK|= 0x04;//enable 0verflow interrupt*/

}


void TC3_Set_PWM(unsigned int curF)

{

    unsigned int temp;


    if(curF==0)

    {

        //OCR3A = 0;

        //OCR3B = 0;

        TCCR3A=0;

    }

    else if((curF>=20)&&(curF<=2000))

    {

        temp = F_CPU/16/curF;

        OCR3A=temp;

        TCCR3A=(0<    }

}


void Timer4_Init(void)

{

    unsigned int temp;


    timer4_ticks = 0;

    timer4_ticksmin = 0;


    TCCR4A = 0x00;

    TCCR4B = 0x00;

    TCCR4C = 0x00;

    TCNT4H = 0x00;

    TCNT4L = 0x00;

    temp = F_CPU/16/20;

    OCR4A=temp;

    //temp = temp/2;

    //OCR4B=temp;

    //OCR4C=temp;

    //TCCR4A=(0<    TCCR4B=(1<}


void TC4_Set_PWM(unsigned int curF)

{

    unsigned int temp;


    if(curF==0)

    {

        //OCR4A = 0;

        //OCR4B = 0;

        TCCR4A=0;

    }

    else if((curF>=20)&&(curF<=2000))

    {

        temp = F_CPU/16/curF;

        OCR4A=temp;

        TCCR4A=(0<    }

}


void Timer5_Init(void)

{

    unsigned int temp;


    timer5_ticks = 0;

    timer5_ticksmin = 0;


    TCCR5A = 0x00;

    TCCR5B = 0x00;

    TCCR5C = 0x00;

    TCNT5H = 0x00;

    TCNT5L = 0x00;

    temp = F_CPU/16/20;

    OCR5A=temp;

    //temp = temp/2;

    //OCR5B=temp;

    //OCR5C=temp;

    //TCCR5A=(0<

[1] [2]
关键字:ATmega2560  单片机  PWM输出  独立控制 引用地址:ATmega2560单片机12路PWM输出的程序 每路PWM可独立控制

上一篇:bascom avr单片机仿真oled显示
下一篇:Atmega16单片机实验:DS18B20和ad采集显示程序

推荐阅读

产品唯一的身份标识的作用: ● 用来作为序列号(例如USB字符序列号或者其他的终端应用); ● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性; ● 用来激活带安全机制的自举过程; 96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一...
外媒报道,霍尼韦尔(Honeywell)推出两款用于导航的小型、轻量级惯性测量单元(IMU)。该紧凑型传感器能够承受恶劣的航空、陆地或水下环境,服务于农业、机器人、测绘、自动驾驶汽车和交通运输等市场。
10月20日晚间,紫光国微发布2020年第三季度财报,财报披露,前三季度公司实现营业收入23.20亿元,扣除合并范围变化的影响,同比增长23%;归属于上市公司股东的净利润6.84亿元,同比增长88%;归属于上市公司股东的扣非后净利润6.24亿元,同比增长66%。展望全年预计净利润达到7.51亿元-8.72亿元,同比增长85%-115%。报告期内,紫光国微创新业务取得了显著进...
荣耀官方于昨日宣布了旗下新品荣耀 Play5 活力版将于 10 月 25 日晚 7 点半对外发布,今日荣耀官方又在微博上发文预热,称荣耀 Play5 活力版将支持 66W 超级快充。  IT之家了解到,荣耀 Play5 活力版的快充功率已经跟荣耀 Magic 3 系列相当,但还不及荣耀 50 系列的 100W 快充。  从官方的图片可以看出,该机型为后置三...

史海拾趣

问答坊 | AI 解惑

谁可以帮我设计一个环行变压器同名端判定电路

各位大哥,现在我有一个环行变压器,初级和次级砸数比是8:1,然后一个小的震荡磁环初级和次级砸数比是1:1。哪位大哥可以帮我设计一个简单一点的电路可以用来测试这个变压器的同名端…

查看全部问答∨

LM3S1138对GPIO口的操作

  刚开始使用LM3S1138,在开发例程里面看到对GPIO口引脚操作的函数,问题:有没有直接读写8bit端口的方法,就像以前的51单片机那样,P0=0xff,等等。谢谢!    …

查看全部问答∨

大哥!wince 怎么做窗体嵌套啊,没有mdi

pc 程序中很容易做父子窗体 ,可是wince 中怎么实现啊,实在找不到.设置parent也不可以,说是不是预计的数据. …

查看全部问答∨

Linux精品教程

朋友们来下载吧,绝对精品,包含全部内容!…

查看全部问答∨

天线阻抗匹配网络

本帖最后由 paulhyde 于 2014-9-15 04:00 编辑 那天线阻抗匹配网络怎么算,我现在只有一个0.47m长的天线,怎么搞匹配网络,怎么算?  …

查看全部问答∨

STM32串口问题

    遇到一个不解的问题:我在做STM32的串口使用的是USART1,在引脚初始化的时候需要在初始化9、10引脚前面加一个其它引脚初始化操作,不加不能正常使用串口,具体初始化那个端口没有关系,只要有这个操作就行 就是上图红框里的 ...…

查看全部问答∨

ADM3052各类型CAN收发器 总线侧带线性电源

ADM3052各类型CAN收发器 总线侧带线性电源 ADM3052是一款隔离式控制器区域网络(CAN)物理层收发器,集成V+线性调节器,符合ISO 11898标准。 该器件采用ADI公司的 iCoupler® 技术,将三通道隔离器、CAN收发器和LDO调节器集成于单封装中。逻辑 ...…

查看全部问答∨

EE Logic PCB实物Show

板子早就该送出去打板了,今天终于收到了。 先Show一下。 总共有10片板子。学长预定了两块,自己留两块。还有六块空板。 等我焊接完初步测试成功了仔开始正式的”共享“ 板子正面 Logo 板子背面…

查看全部问答∨

画板是powerpcb好用还是protel好用

画板是powerpcb好用还是protel好用 \0\0\0eeworldpostqq…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved