文章目录
- 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);}}}