STM32 (4)PWM驱动LED呼吸灯
2026/9/12 10:08:49 网站建设 项目流程

文章目录

    • 1.PWM基本结构
    • 2.函数
    • 代码

1.PWM基本结构

蓝线:CNT
黄线:ARR
红线:CCR

1.RCC开启 时钟
2.选择内部时钟源
TIM_InternalClockConfig()
3.配置时基单元——预分频器、自动重装器、计数模式等
TIM_TimeBaseInit()
4.配置输出比较单元
TIM_OC1Init()
TIM_OC2Init()
TIM_OC3Init()
TIM_OC4Init()
5.配置GPIO
6.运行控制,配置完需要使能计数器
TIM_Cmd()

2.函数

TIM_OC1Init()
TIM_OC2Init()
TIM_OC3Init()
TIM_OC4Init()输出比较函数,一个函数配置一个单元
TIM_OCStructInit()给输出比较函数赋默认值
TIM_ForcedOC1Config()1-4,4个函数,用来配置强制输出模式的高or低电平
TIM_CCxCmd()
TIM_CCxNCmd()单独已修改输出使能参数
TIM_SelectOCxM()选择输出比较模式
TIM_SetCompare1()1-4。单独用来更改CCR寄存器值的函数(重点)
输出比较模式,CCR只写,所以用TIM_SetCompare

代码里面三个数字部分就是根据上面的公式求

代码

根据上一章的代码进行一部分修改

#include"stm32f10x.h"// Device headervoidPWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2在APB1总线上RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出,把控制权交给片上外设,PWM波形才能通过引脚输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//分频模式TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式TIM_TimeBaseInitStructure.TIM_Period=100-1;//周期,ARR自动重装器的值.定时频率=72M/(PSC+1)/(ARR+1)TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//预分频器(PSC)的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计算器的值,这是高级才用,直接给0TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);TIM_OCInitTypeDef TIM_OC1InitStructure;TIM_OCStructInit(&TIM_OC1InitStructure);//先赋初始值,再修改想修改的参数TIM_OC1InitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较模式TIM_OC1InitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出比较极性TIM_OC1InitStructure.TIM_OutputState=TIM_OutputState_Enable;//设置输出使能TIM_OC1InitStructure.TIM_Pulse=50;//设置CCRTIM_OC1Init(TIM2,&TIM_OC1InitStructure);TIM_Cmd(TIM2,ENABLE);}voidPWM_SetCompare1(uint16_tCompare){TIM_SetCompare1(TIM2,Compare);}

主函数部分

uint8_ti;intmain(void){OLED_Init();PWM_Init();while(1){for(i=0;i<=100;i++){PWM_SetCompare1(i);Delay_ms(10);}for(i=0;i<=100;i++){PWM_SetCompare1(100-i);Delay_ms(10);}}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询