此文学习总结,代码可参考
1.delay延时(蓝桥杯主板程序LED)
原理:通过延时函数控制灯使亮暗时间不一样,使得占空比不同,实现亮度控制
优缺点:类似于PWM但是无法做到精确控制亮度占比,如使某个灯的亮度为50%
void Delay_Led(u16 temp)
{
u16 i=temp;
for(i=i; i>0; i--); //delay
}
void LED_light_control(void)
{
unsigned char i, j, k;
for(i=0; i<16; i++)
{
for(j=0; j<16-i; j++)
for(k=8; k<16; k++)
{
GPIO_Write(GPIOC,~(1<<k));
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //状态锁存
Delay_Led(1<<k);
}
}
}
2.定时器中断
原理:在频率足够大,中断足够快的条件下,使得在一定周期内,每个灯亮的概率不同,从而控制占空比的不同,使得最终灯的亮暗不同
优缺点:代码改起来不好改,灯亮度精确度并不能实现太高,因为随着精确度的增加,必须使得计数周期曾大,来确保目标亮度可计算,这样一来周期就会变大而且代码更加难改
void TIM2_IRQHandler(void)
{
static u8 Tim_Count=0;
if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) == SET){
//清除标志位
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
//
Tim_Count++;
if(Tim_Count==1)GPIO_Write(GPIOC,0x00ff);
else if(Tim_Count==2)GPIO_Write(GPIOC,0x80ff);
else if(Tim_Count==3)GPIO_Write(GPIOC,0xC0ff);
else if(Tim_Count==4)GPIO_Write(GPIOC,0xe0ff);
else if(Tim_Count==5)GPIO_Write(GPIOC,0xf0ff);
else if(Tim_Count==6)GPIO_Write(GPIOC,0xf8ff);
else if(Tim_Count==7)GPIO_Write(GPIOC,0xfcff);
else if(Tim_Count==8)GPIO_Write(GPIOC,0xfeff);
else if(Tim_Count==9)GPIO_Write(GPIOC,0xffff);
else {GPIO_Write(GPIOC,0xffff);Tim_Count=0;}
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
注:多个灯的亮暗控制,单个灯类似,控制GPIO的写入即可,须将ARR,PSC舍得足够小,不然会闪
3.PWM输出控制
原理:设置占空比,即可
优缺点:配置好PWM后只需一个循环即可,容易更改
int main(void)
{
//LCD工作模式配置
SysTickInit();
TIM_PWM_Init();
USART_Config();
// TIM_SetCompare2(TIM2,500); //占空比为500/1000=50%
// TIM_SetCompare3(TIM2,700); //占空比为700/1000=70%
while(1){
TIM_SetCompare2(TIM2,i*100);
sprintf((char*)str,"%d%%\n",10*i);
USART_SendString(str);
Delay_Ms(200);
i++;
if(i==11){i=0;}
}
}