STM32学习笔记-PWM波形输出.pdf
调试芯片:STM32F103C8T6 外部晶振:8MHz 功能介绍:使用 Timer3 实现两路(可四路)PWM 波形的输出 代码如下:初始化:系统时钟初始化,GPIO 端口初始化,Timer 初始化 系统时钟初始化:1./*配置系统时钟为 72M*/GPIO 端口初始化:2.3.4.5.6.*函数名:void GPIO_Config(void)*描述:配置复用输出 PWM 时用到的 I/O*输入*输出*调用:main()调用 Timer 初始化:2.3.*函数名:void TIM3_Config(void)*描述:配置 TIM3 输出的 PWM 信号的模式 电平在后)2.SystemInit();1./*:无:无 7.*/8.void GPIO_Config(void)9.10.GPIO_InitTypeDef GPIO_InitStructure;11.12./*GPIOA and GPIOB clock enable*/13.RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);14.19.GPIO_Init(GPIOA,&GPIO_InitStructure);20.1./*4.*CH1:输出 T=2.5ms(f=1/2.5ms=400Hz)D=0.6 的 PWM 波(高电平在前,低 15./*GPIOA Configuration:TIM3 channel 1 and 2 as alternate function push-pull*/16.GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;17.GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;挽输出/复用推 18.GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;电平在前)6.*9.*10.*步骤一:通过 T 和 TIMxCLK 的时钟源确定 TIM_Period 和 TIM_Prescaler 所以 TIM_Period=59999=0 xEA5F 步骤二:根据 TIM_Period 的值,高低电平的先后 D,确定 CCR 和 11.TIM_OCPolarity*CH1:因为 D=0.6,先高后低;12.*所以 CCR1=(TIM_Period+1)13.*D=36000;TIM_OCPolarity=TIM_OCPolarity_High *CH2:因为 D=0.4,先高后低;14.*所以 CCR1=(TIM_Period+1)*(1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low 15.*16.*17.*18.*步骤五:使能 TIM3 重载寄存器 ARR 步骤六:使能 TIM3 19.20.21.*输入*输出*调用:main()调用 27.30./*PWM 信号电平跳变值*/*PCLK1 经过 2 倍频后作为 TIM3 的时钟源等于 72MHz*/设置预分频:预分频=2,即为 72/3=24MHz/设置时钟分频系数:不分频 /向上计数溢出模式 5.*CH2:输出 T=2.5ms(f=1/2.5ms=400Hz)D=0.4 的 PWM 波(高电平在后,低 7.*T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms 8.*TIM_Prescaler=2 因为 TIM_Period1,即 步骤三:基础寄存器初始化 步骤四:通道寄存器初始化:无:无 22.*/23.void TIM3_Config(void)24.25.TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;26.TIM_OCInitTypeDef TIM_OCInitStructure;28.u16 CCR1=36000;29.u16 CCR2=36000;31.RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);32./*Time base configuration*/33.TIM_TimeBaseStructure.TIM_Period=0 xEA5F;34.TIM_TimeBaseStructure.TIM_Prescaler=2;35.TIM_TimeBaseStructure.TIM_ClockDivision=0;36.TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;37.TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);38./*PWM1 Mode configuration:Channel1*/2.3.4.5./配置为 PWM 模式 1 /设置跳变值,当计数器计数到这个值时,电平发生跳变 /当定时器计数值小于 CCR1 时为高电平 /使能通道 1 /设置通道 2 的电平跳变值,输出另外一个占空比的 PWM/当定时器计数值小于 CCR2 时为低电平 /使能通道 2 /使能 TIM3 重载寄存器 ARR /使能 TIM3 主函数代码:*函数名:main*描述*输入*输出 39.TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;40.TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;41.TIM_OCInitStructure.TIM_Pulse=CCR1;42.TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;43.TIM_OC1Init(TIM3,&TIM_OCInitStructure);44.TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);45./*PWM1 Mode configuration:Channel2*/46.TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;47.TIM_OCInitStructure.TIM_Pulse=CCR2;48.TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;49.TIM_OC2Init(TIM3,&TIM_OCInitStructure);50.TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);51.TIM_ARRPreloadConfig(TIM3,ENABLE);52./*TIM3 enable counter*/53.TIM_Cmd(TIM3,ENABLE);54.1./*:主函数:无:无 6.*/7.int main(void)8.9.SystemInit();10.GPIO_Config();11.TIM3_Config();12.while(1)13.14.15.最后上结果图:疑问:虽然不影响用,但是为什么第一个周期不正确,正确的 波形是从第二个周期开 始输出的?16.