PWM控制呼吸灯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*
*@Name: PWM_led
*@version 1.0
*@Author xiaopan
*@Date 2014.8.2
*/
#include<pic.h>
#define uint unsigned int
#define uchar unsigned char
#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1
#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1
uint Time = 0;
uint cnt_1ms = 0;
uchar State = 0;
void GPIO_INIT();
void TIMER2_INIT();
void TIMER4_INIT();
void PWM_INIT();
void Control_Task();
/*
*@function主函数
*/
void main()
{
GPIO_INIT();
PWM_INIT();
TIMER2_INIT(); //PWM利用TIMER2
TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形
while(1)
{
Control_Task();
}
}
/*
*@Function IO口初始化RG0 CCP3 RG3 CCP4
*/
void GPIO_INIT()
{
TRISG = 0X00; //设置RG口为输出
ANSELG = 0; //设置RG口为数字量
LATG = 0; //设置RG口为低电平
TRISF = 0;
ANSELF = 0;
LATF = 0;
}
/*
*@定时器2初始化
*/
void TIMER2_INIT()
{
TMR2 = 0;
PR2 = 255; //255
TMR2IF = 0;
T2CKPS0 = 1; //1
T2CKPS1 = 0; //0
TMR2ON = 1;
}
/*
*@定时器4初始化
*/
void TIMER4_INIT()
{
T4CON = 0x0e; //0000 1110
TMR4IE = 1;
TMR4IF = 0;
TMR4 = 0X00;
PEIE = 1;
GIE = 1;
}
/*
*@ PWM初始化
*/
void PWM_INIT()
{
CCP3CON = 0X0C;
CCP4CON = 0X0C;
CCPTMRS0 &= 0X0F;
TRISG = 0;
}
/*
*@Function 主任务函数
*/
void Control_Task()
{
static uint Time ;
// static uchar State = 0;
static uint Record_Time;
uint Delta_Time;
if(State == 0)
{
Time = 1000;
State = 1;
}
if(State == 1)
{
PWM1(Time);
PWM2(Time);
Record_Time = cnt_1ms;
State = 2;
}
if(State == 2)
{
if (cnt_1ms < Record_Time)
{
Delta_Time = 65536 - Record_Time + cnt_1ms;
}
else
{
Delta_Time = cnt_1ms - Record_Time;
}
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
{
Time = Time - 100;
State = 1;
if(Time == 0)
{
Time = 0;
State = 3;
}
}
}
if(State == 3)
{
PWM1(Time);
PWM2(Time);
Record_Time = cnt_1ms;
State = 4;
}
if(State == 4)
{
if (cnt_1ms < Record_Time)
{
Delta_Time = 65536 - Record_Time + cnt_1ms;
}
else
{
Delta_Time = cnt_1ms - Record_Time;
}
if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT
{
Time = Time + 100;
State = 3;
if(Time == 1000)
{
State = 0;
}
}
}
}
void interrupt ISR(void)
{
if(TMR4IF == 1)
{
TMR4IF = 0;
cnt_1ms++;
// LATF0 = !LATF0;
}
}。

相关文档
最新文档