《《《《《正文》》》》》
《加载库文件》
《硬件设计》
看手册可以知道:
* TIM3 CH1(PWM1) -> PA6
* TIM3 CH2(PWM2) -> PA7
* TIM3 CH3(PWM3) -> PB0
* TIM3 CH4(PWM4) -> PB1
《软件设计》
设计4路PWM控制的LED;
1、初始化函数,
这里需要注意的是下面这个配置项:
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low/TIM_OCPolarity_High,意思是输出比较极性的配置,就是表示输出高低的设置,我上面LED的电路是上拉VDD,因此有效电平为GPIO输出低电平led才会亮,因此这里就要设置成低;其实这个就是低电平起还是高电平起;
/******************************************************************************************
* 函 数:void PWM_Init(void)
* 功 能:LED引脚初始化 以及TIM3 配置输出PWM
* 参 数:无
* 返回值:无
* 备 注:TIM3 CH1(PWM1) -> PA6
* TIM3 CH2(PWM2) -> PA7
* TIM3 CH3(PWM3) -> PB0
* TIM3 CH4(PWM4) -> PB1
*******************************************************************************************/
void PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO结构体变量
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; //定义定时器结构体变量
TIM_OCInitTypeDef TIM_OCInitStruct; //定义输出比较结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //GPIOA、B、复用时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3的时钟
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; //配置GPIO第6、7引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; //配置GPIO为复用推挽输出
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //配置GPIO速率
GPIO_Init(GPIOA,&GPIO_InitStruct); //GPIO初始化函数
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; //配置GPIO第0、1引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; //配置GPIO为复用推挽输出
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //配置GPIO速率
GPIO_Init(GPIOB,&GPIO_InitStruct); //GPIO初始化函数
TIM_TimeBaseInitStruct.TIM_Period=1000-1; //设置自动重装载的周期值
TIM_TimeBaseInitStruct.TIM_Prescaler=100; //设置预分频值
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //设置时钟分割
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct); //定时器初始化函数
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1
TIM_OCInitStruct.TIM_Pulse=0; //初始化占空比为0
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low; //输出比较极性低
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OC1Init(TIM3,&TIM_OCInitStruct); //比较输出初始化函数
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //输出比较1预装载寄存器使能
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1
TIM_OCInitStruct.TIM_Pulse=0; //初始化占空比为0
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low; //输出比较极性低
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OC2Init(TIM3,&TIM_OCInitStruct); //比较输出初始化函数
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //输出比较2预装载寄存器使能
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1
TIM_OCInitStruct.TIM_Pulse=0; //初始化占空比为0
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low; //输出比较极性低
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OC3Init(TIM3,&TIM_OCInitStruct); //比较输出初始化函数
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); //输出比较3预装载寄存器使能
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1
TIM_OCInitStruct.TIM_Pulse=0; //初始化占空比为0
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low; //输出比较极性低
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OC4Init(TIM3,&TIM_OCInitStruct); //比较输出初始化函数
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable); //输出比较4预装载寄存器使能
TIM_Cmd(TIM3,ENABLE); //TIM3使能
}
2、占空比控制函数
/************************************************************************************************
* 函 数:void LED_Pwm(int16_t LED1_PWM,int16_t LED2_PWM,int16_t LED3_PWM,int16_t LED4_PWM)
* 功 能:LED要输出数值转换成PWM波形输出
* 参 数:LED1_PWM LED1
* LED2_PWM LED2
* LED3_PWM LED3
* LED4_PWM LED4
* 返回值:无
* 备 注:无
************************************************************************************************/
void LED_Pwm(int16_t LED1_PWM,int16_t LED2_PWM,int16_t LED3_PWM,int16_t LED4_PWM)
{
TIM3->CCR1 = LED1_PWM;
TIM3->CCR2 = LED2_PWM;
TIM3->CCR3 = LED3_PWM;
TIM3->CCR4 = LED4_PWM;
}
3、主函数,产生0%,40%,80%,100%的占空比电平,点亮不同的LED亮度;
int main(void)
{
PWM_Init();
for(;;)
{
LED_Pwm(0,400,800,1000);
}
}
《呼吸灯设计》
其中延时模块参考:
STM32F103之systick延时(SYSTICK)模块开发
int main(void)
{
uint16_t tmp_pwm=0;
uint8_t pwmFlag = 1;
PWM_Init();
Delay_Init(); //延时初始化,可看我的systick模块文章
for(;;)
{
Delay_ms(20); //每20ms改变一次 延时函数
LED_Pwm(tmp_pwm,0,0,0);
if(pwmFlag) //递加
{
tmp_pwm+=100; //一次改变10%的占空比
if(tmp_pwm>1000)
{
tmp_pwm =1000;
pwmFlag = 0;
}
}
else//递减
{
tmp_pwm-=100;
if(tmp_pwm==0)
{
tmp_pwm =0;//一次改变10%的占空比
pwmFlag = 1;
}
}
}
}
源代码:
链接:https://pan.baidu.com/s/141UWzjFweWzLgFEaNgEHrQ
关注公众号,发送1234获取提取码;
《《《《《END》》》》》