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< 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< 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< 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<
上一篇:bascom avr单片机仿真oled显示
下一篇:Atmega16单片机实验:DS18B20和ad采集显示程序
推荐阅读
史海拾趣
Delphi Connection Systems公司自创立之初,就致力于在电子行业中的连接器技术上进行创新。公司投入大量研发资源,开发出一种新型的高性能连接器,这种连接器具有更小的体积、更高的可靠性和更低的传输损耗。这一创新成果迅速获得了市场的认可,为公司带来了大量的订单和合作机会。
人才是企业发展的核心竞争力。Cantherm公司深知这一点,因此始终重视人才的引进和培养。公司不仅提供优厚的福利待遇和广阔的发展平台,还积极开展员工培训和技能提升计划。通过不断吸引和培养高素质人才,Cantherm公司逐渐建立了一支高效、专业的团队,为公司的持续发展提供了有力保障。
请注意,以上故事均为虚构,旨在展示一个电子行业中虚构公司可能遇到的发展情况。如有需要,您可以根据实际情况进行调整或补充。
EOZ S.A.S公司非常重视企业文化和团队建设。公司倡导“创新、协作、共赢”的价值观,鼓励员工积极参与创新活动并分享创新成果。同时,公司还注重员工的培训和发展,为员工提供丰富的培训资源和晋升机会。这些举措不仅激发了员工的积极性和创造力,也为企业的发展提供了有力的人才保障。在EOZ S.A.S公司的发展历程中,优秀的企业文化和团队成为公司最宝贵的财富之一。
在电子行业快速发展的背景下,安碁科技始终坚持持续创新和客户导向的经营理念。公司不断投入研发资源,推出具有竞争力的新产品和解决方案,以满足客户不断变化的需求。同时,安碁科技也注重与客户的沟通和合作,深入了解客户的需求和反馈,不断优化产品和服务。这种以客户为中心的经营模式,使得安碁科技在市场上赢得了良好的声誉和口碑。
这五个故事只是安碁科技发展历程中的一部分,但它们充分展示了公司在电子行业中的崛起和发展。安碁科技凭借其卓越的技术实力、品质管理和创新能力,在激烈的市场竞争中脱颖而出,成为行业的佼佼者。未来,随着电子行业的不断发展和变化,安碁科技将继续保持创新和进取的精神,为客户和市场带来更多优质的产品和服务。
为了进一步拓展业务,Chip Quik公司积极寻求与电子制造商、维修中心和分销商等合作伙伴建立合作关系。通过与这些合作伙伴的紧密合作,公司能够更好地了解市场需求,优化产品供应链,提高市场覆盖率。
为了进一步拓展业务,Chip Quik公司积极寻求与电子制造商、维修中心和分销商等合作伙伴建立合作关系。通过与这些合作伙伴的紧密合作,公司能够更好地了解市场需求,优化产品供应链,提高市场覆盖率。
各位大哥,现在我有一个环行变压器,初级和次级砸数比是8:1,然后一个小的震荡磁环初级和次级砸数比是1:1。哪位大哥可以帮我设计一个简单一点的电路可以用来测试这个变压器的同名端… 查看全部问答∨ |
刚开始使用LM3S1138,在开发例程里面看到对GPIO口引脚操作的函数,问题:有没有直接读写8bit端口的方法,就像以前的51单片机那样,P0=0xff,等等。谢谢! … 查看全部问答∨ |
ADM3052各类型CAN收发器 总线侧带线性电源 ADM3052是一款隔离式控制器区域网络(CAN)物理层收发器,集成V+线性调节器,符合ISO 11898标准。 该器件采用ADI公司的 iCoupler® 技术,将三通道隔离器、CAN收发器和LDO调节器集成于单封装中。逻辑 ...… 查看全部问答∨ |
|
板子早就该送出去打板了,今天终于收到了。 先Show一下。 总共有10片板子。学长预定了两块,自己留两块。还有六块空板。 等我焊接完初步测试成功了仔开始正式的”共享“ 板子正面 Logo 板子背面… 查看全部问答∨ |