359 lines
12 KiB
C
359 lines
12 KiB
C
#include "pwm_control.h"
|
|
#include "GPIO.h"
|
|
#include "STC8xxxx.h"
|
|
#include "PWM15bit.h"
|
|
#include "timer.h"
|
|
#include "UART_Set.h"
|
|
#include "string.h"
|
|
S_PWM s_pwm;
|
|
/*
|
|
*1.串口5.0/5.1的初始化
|
|
*2.初始化PWM引脚
|
|
*3.LED_DRV_12V_EN让单片机运行
|
|
*/
|
|
/******************* IO配置函数 *******************/
|
|
void GPIO_config(void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
|
|
/***********************************1*******************************************/
|
|
GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
|
|
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
|
|
GPIO_Inilize(GPIO_P5,&GPIO_InitStructure); //初始化
|
|
|
|
/***********************************2*******************************************/
|
|
GPIO_InitStructure.Pin = GPIO_Pin_All; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
|
|
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
|
|
GPIO_Inilize(GPIO_P0,&GPIO_InitStructure); //初始化
|
|
|
|
GPIO_InitStructure.Pin = GPIO_Pin_Left; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
|
|
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
|
|
GPIO_Inilize(GPIO_P2,&GPIO_InitStructure); //初始化
|
|
|
|
/***********************************3*******************************************/
|
|
GPIO_InitStructure.Pin = GPIO_Pin_0; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
|
|
GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
|
|
GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化
|
|
}
|
|
|
|
void pwm_config(void)
|
|
{
|
|
u8 i;
|
|
PWM15_InitTypeDef PWM15_InitStructure;
|
|
|
|
PWM15_InitStructure.PWM_Enable = ENABLE; //PWM使能, ENABLE, DISABLE
|
|
PWM15_InitStructure.PWM_Period = 0x04E2; //PWM周期, 1250,频率为16khz
|
|
PWM15_InitStructure.PWM_Clock_Sel = PWMn_CLK_SYS; //时钟源选择, PWMn_CLK_SYS, PWMn_CLK_TM2
|
|
PWM15_InitStructure.PWM_Clock_PS = 0; //系统时钟分频参数(PS+1分频), 0~15
|
|
PWM15_InitStructure.PWM_Counter = ENABLE; //计数器使能, ENABLE, DISABLE
|
|
|
|
PWM15_Init(PWM0,&PWM15_InitStructure); //初始化PWM0
|
|
PWM15_Init(PWM2,&PWM15_InitStructure); //初始化PWM2
|
|
|
|
PWM15Duty(PWM00,initial_Val); //PWM_ID, 输出低电平位置, 输出高电平位置
|
|
PWM15Duty(PWM01,initial_Val); //PWM_ID, 输出低电平位置, 输出高电平位置
|
|
PWM15Duty(PWM02,initial_Val); //PWM_ID, 输出低电平位置, 输出高电平位置
|
|
PWM15Duty(PWM03,initial_Val); //PWM_ID, 输出低电平位置, 输出高电平位置
|
|
PWM15Duty(PWM04,initial_Val);
|
|
PWM15Duty(PWM05,initial_Val);
|
|
PWM15Duty(PWM06,initial_Val);
|
|
PWM15Duty(PWM07,initial_Val);
|
|
|
|
PWM15Duty(PWM20,initial_Val);
|
|
PWM15Duty(PWM21,initial_Val);
|
|
PWM15Duty(PWM22,initial_Val);
|
|
PWM15Duty(PWM23,initial_Val);
|
|
|
|
memset(&s_pwm,0,sizeof(s_pwm));
|
|
for(i=0;i<12;i++)
|
|
{
|
|
s_pwm.currpwm[i]=initial_Val;
|
|
}
|
|
PWMChannelCtrl(PWM00,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM01,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM02,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM03,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM04,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM05,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM06,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM07,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
|
|
PWMChannelCtrl(PWM20,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM21,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM22,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
PWMChannelCtrl(PWM23,ENABLE,1,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
|
|
|
|
}
|
|
|
|
|
|
//10ms渐变一级
|
|
void deal_command1(void)
|
|
{
|
|
int i=0;
|
|
static u32 systick_command1 = 0;
|
|
|
|
if (systick_1ms - systick_command1 >= 10)
|
|
{
|
|
systick_command1 = systick_1ms;
|
|
for (i = 0; i < 12; i++)
|
|
{
|
|
if (s_recv.flag1[i])
|
|
{
|
|
if (s_pwm.wanttopwm[i] > s_pwm.currpwm[i])
|
|
{
|
|
//s_pwm.doublecurrpwm[i] = s_pwm.currpwm[i];
|
|
s_pwm.doublecurrpwm[i] += s_pwm.every_change_10ms[i];
|
|
s_pwm.currpwm[i] = (u16)s_pwm.doublecurrpwm[i];
|
|
|
|
if(s_recv.global_brightness==0)
|
|
{
|
|
s_pwm.currvalue[i]=0;
|
|
}
|
|
else
|
|
{
|
|
s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_brightness;
|
|
}
|
|
|
|
if ( s_pwm.wanttopwm[i] < s_pwm.currpwm[i])
|
|
{
|
|
s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
|
|
}
|
|
}
|
|
|
|
|
|
//当想要的亮度大于当前值时
|
|
if (s_pwm.wanttopwm[i] < s_pwm.currpwm[i])
|
|
{
|
|
//s_pwm.doublecurrpwm[i] = s_pwm.currpwm[i];
|
|
s_pwm.doublecurrpwm[i] -= s_pwm.every_change_10ms[i];
|
|
s_pwm.currpwm[i] = (u16)s_pwm.doublecurrpwm[i];
|
|
|
|
if(s_recv.global_brightness==0)
|
|
{
|
|
s_pwm.currvalue[i]=0;
|
|
}
|
|
else
|
|
{
|
|
s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_brightness;
|
|
}
|
|
|
|
if (s_pwm.currpwm[i] < s_pwm.wanttopwm[i] + s_pwm.every_change_10ms[i])
|
|
{
|
|
s_pwm.currpwm[i] = 0;
|
|
s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
|
|
}
|
|
}
|
|
|
|
|
|
if (s_pwm.wanttopwm[i] == s_pwm.currpwm[i])
|
|
{
|
|
s_pwm.currvalue[i] = s_recv.B_Ch[i];
|
|
s_recv.flag1[i] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void deal_command2(void)
|
|
{
|
|
int i=0;
|
|
static u32 systick_command2 = 0;
|
|
if (systick_1ms - systick_command2 >= 10)
|
|
{
|
|
systick_command2 = systick_1ms;
|
|
for (i = 0; i < 12; i++)
|
|
{
|
|
if (s_recv.flag2[i])
|
|
{
|
|
switch (s_recv.mode[i])
|
|
{
|
|
//顶端停止模式
|
|
case 0x00:
|
|
//亮度降低
|
|
if (s_recv.forward[i] == 0x00)
|
|
{
|
|
s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_min * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100 * s_recv.key_status[i];
|
|
s_pwm.currpwm[i] += s_recv.pwm_step[i];
|
|
if(s_recv.global_brightness==0)
|
|
{
|
|
s_pwm.currvalue[i]=0;
|
|
}
|
|
else
|
|
{
|
|
s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_brightness;
|
|
}
|
|
if (s_pwm.currpwm[i] >= s_pwm.wanttopwm[i])
|
|
{
|
|
s_recv.flag2[i] = 0;
|
|
s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
|
|
s_pwm.currvalue[i] = s_recv.B_min; //用于回复数据
|
|
}
|
|
}
|
|
//亮度增加
|
|
if (s_recv.forward[i] == 0x01)
|
|
{
|
|
s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_max * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100 * s_recv.key_status[i];
|
|
if (s_pwm.currpwm[i] <= s_pwm.wanttopwm[i] + s_recv.pwm_step[i])
|
|
{
|
|
s_recv.flag2[i] = 0;
|
|
s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
|
|
s_pwm.currvalue[i] = s_recv.B_max;
|
|
}
|
|
else
|
|
{
|
|
s_pwm.currpwm[i] -= s_recv.pwm_step[i];
|
|
if(s_recv.global_brightness==0)
|
|
{
|
|
s_pwm.currvalue[i]=0;
|
|
}
|
|
else
|
|
{
|
|
s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_brightness;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
//双向循环模式
|
|
case 0x01:
|
|
//递减
|
|
if (s_recv.forward[i] == 0x00)
|
|
{
|
|
s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_min * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100 * s_recv.key_status[i];
|
|
s_pwm.currpwm[i] += s_recv.pwm_step[i];
|
|
if(s_recv.global_brightness==0)
|
|
{
|
|
s_pwm.currvalue[i]=0;
|
|
}
|
|
else
|
|
{
|
|
s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_brightness;
|
|
}
|
|
if (s_pwm.currpwm[i] >= s_pwm.wanttopwm[i])
|
|
{
|
|
s_recv.forward[i] = 0x01;
|
|
s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
|
|
s_pwm.currvalue[i] = s_recv.B_min; //用于回复数据
|
|
}
|
|
}
|
|
//递增
|
|
if (s_recv.forward[i] == 0x01)
|
|
{
|
|
s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_max * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100 * s_recv.key_status[i];
|
|
if (s_pwm.currpwm[i] <= s_pwm.wanttopwm[i] + s_recv.pwm_step[i])
|
|
{
|
|
s_recv.forward[i] = 0x00;
|
|
s_pwm.currpwm[i] = s_pwm.wanttopwm[i];
|
|
s_pwm.currvalue[i] = s_recv.B_max;
|
|
}
|
|
else
|
|
{
|
|
s_pwm.currpwm[i] -= s_recv.pwm_step[i];
|
|
if(s_recv.global_brightness==0)
|
|
{
|
|
s_pwm.currvalue[i]=0;
|
|
}
|
|
else
|
|
{
|
|
s_pwm.currvalue[i] = (PWM_MAX_VALUE - s_pwm.currpwm[i]) * 100 * 100 / PWM_MAX_VALUE / s_recv.global_brightness;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 0x02:
|
|
//停止调节
|
|
s_recv.flag2[i] = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//直接关掉灯,并记录状态
|
|
void Close_Light(u8 i)
|
|
{
|
|
s_pwm.currpwm[i]=20001ul; //持续输出高电平,非常特殊,勿改
|
|
}
|
|
|
|
//打开灯时,会回复到原来的亮度
|
|
void Open_Light(u8 pin)
|
|
{
|
|
s_pwm.currpwm[pin] = PWM_MAX_VALUE - s_pwm.currvalue[pin] * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100;
|
|
}
|
|
|
|
void PWM_write(u8 i, u16 Val)
|
|
{
|
|
switch (i)
|
|
{
|
|
case 0:
|
|
PWM15Duty(PWM07,Val);
|
|
break;
|
|
case 1:
|
|
PWM15Duty(PWM06,Val);
|
|
break;
|
|
case 2:
|
|
PWM15Duty(PWM05,Val);
|
|
break;
|
|
case 3:
|
|
PWM15Duty(PWM04,Val);
|
|
break;
|
|
case 4:
|
|
PWM15Duty(PWM03,Val);
|
|
break;
|
|
case 5:
|
|
PWM15Duty(PWM02,Val);
|
|
break;
|
|
case 6:
|
|
PWM15Duty(PWM01,Val);
|
|
break;
|
|
case 7:
|
|
PWM15Duty(PWM00,Val);
|
|
break;
|
|
case 8:
|
|
PWM15Duty(PWM23,Val);
|
|
break;
|
|
case 9:
|
|
PWM15Duty(PWM22,Val);
|
|
break;
|
|
case 10:
|
|
PWM15Duty(PWM21,Val);
|
|
break;
|
|
case 11:
|
|
PWM15Duty(PWM20,Val);
|
|
break;
|
|
}
|
|
}
|
|
void show_light(void)
|
|
{
|
|
int i;
|
|
for (i = 0; i < 12; i++)
|
|
{
|
|
if(s_pwm.currpwm[i]==20000ul)
|
|
{
|
|
Close_Light(i);
|
|
}
|
|
else
|
|
{
|
|
PWM_write(i, s_pwm.currpwm[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
//void checkpwm(void)
|
|
//{
|
|
// int i;
|
|
// for (i = 0; i < 12; i++)
|
|
// {
|
|
// if ((s_recv.flag1[i] == 0) && (s_recv.flag2[i] == 0) && (s_recv.changeflag == 1))
|
|
// {
|
|
// if (s_pwm.wanttopwmflash[i] != s_pwm.currpwm[i])
|
|
// {
|
|
// s_pwm.currpwm[i] = s_pwm.wanttopwmflash[i];
|
|
// }
|
|
// }
|
|
// }
|
|
// s_recv.changeflag = 0;
|
|
//}
|