#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; //}