历史上的今天
今天是:2024年11月20日(星期三)
2019年11月20日 | AVR ATmega1280定时器PWM输出程序
2019-11-20 来源:51hei
#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< void TC5_Set_PWM(unsigned int curF) { unsigned int temp; if(curF==0) { //OCR5A = 0; //OCR5B = 0; TCCR5A=0; } else if((curF>=20)&&(curF<=2000))
下一篇:ATmage16-ADC
史海拾趣
|
大家好, 我在用ce6编译eboot时,出了点问题,想求教~ 右键build eboot,提示: BUILD: [00:0000000021:PROGC ] Building COMPILE Pass in F:\\WINCE600\\PLATFORM\\SMDK2440\\src\\bootloader\\eboot\\ directory. BUILD: [00:0000000033:WARN ...… 查看全部问答> |
|
看了,Android的介绍,在手机这个大的市场应用下,一个面向智能手机会开发的层次件,也以系统相称了。这与OS核的出现是如是之相似。大量应用下,出在OS层,以解决真接的机器编程。但以前的图形中间件,如QT,opengL之类的都不能以系统相称,但andro ...… 查看全部问答> |
|
据说是有其他分销商和代理商不满意万利以低价格销售STM32的芯片?对我们小批量使用的客户看来还只能等着降价啦。STM32是好用,但是力源网上的价格是不是太贵了?… 查看全部问答> |
|
产生2路PWM就把定时期的3个比较用尽了; 现在还需要一个系统定时,就是等周期做一些任务 感觉看门狗的定时期中断可以使用, 那么我要如何才能正确使用呢?就是做普通定时期,不让它复位MCU 关于AD16: 看TI例子有能从16位A/ ...… 查看全部问答> |
|
图1是TL431内部等效框图,不太懂它的工作原理,请各位大侠帮忙讲一下它是怎么工作的。 正由于工作原理不懂,所以图2所得的公式也不明白。 图3所说的大电流不太懂,加一个三极管,三极管导通时,有大电流从三极管的发射极到集电极流过, ...… 查看全部问答> |
|
// 2012-2 by naga lee#include <reg51.h> #include <intrins.h> //_nop_();sbit Max7129_DIN = P1^3; // Serial-Data Input: rising edge sbit Max7129_LOAD = P1^5; // Loa ...… 查看全部问答> |




