首先,介绍一下情况。本人使用的为STM32F103RC的板子,用的MDK5.1。程序是用高级定时器TIM1的CH1、CH1N、CH2、CH2N通过输出比较模式,产生相位差为90度的4路PWM来驱动步进电机。
接下来说问题:
当程序里的arr、psc和Pulse的值都为固定值,比如:TIM_Period = (2000-1);TIM_Prescaler = (36-1); TIM_Pulse = (1000-1);此时输出的4路PWM相位差确实是为90度,而且频率为72000000/(2000*36*2)=500Hz。此时仿真结果与预期相符。但是我需要的是频率可变的PWM,所以我引入函数,来改变arr的值(引入fval,即频率的值)。此时就出现问题,频率改变不了,一直是100Hz(理论上应该是每隔100ms,频率改变一次,频率从100Hz增大到1000Hz,之后又减小到100Hz)。请各位帮看看,指点一下。谢谢!
main函数:
[mw_shl_code=c,true]#include "delay.h"
#include "sys.h"
#include "pwm.h"
int main(void)
{
u16 fval=100; //初始频率为100Hz
u8 dir=1;
TIM_GPIO_Config();
TIM_Config();
while(1)
{
delay_ms(100); //延时100ms
if(dir) fval=fval+100; //当频率小于1000Hz时,频率增大
else fval=fval-100; //当频率大于1000Hz时,频率减小
if(fval>1000)dir=0;
if(fval==100)dir=1;
}
}
[/mw_shl_code]
[mw_shl_code=c,true]}[/mw_shl_code]
PWM函数:
[mw_shl_code=c,true]#include "pwm.h"
void TIM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9 ; //TIM1_CH1 TIM1_CH2
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13 | GPIO_Pin_14; //TIM1_CH1N TIM1_CH2N
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
[/mw_shl_code]
[mw_shl_code=c,true]void TIM_Config(void)
{[/mw_shl_code]
[mw_shl_code=c,true] u16 fval;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Period = ((1000000/fval)-1); //设置自动装载值 arr=((1000000/fval)-1)
TIM_TimeBaseStructure.TIM_Prescaler = (36-1); //设置分频值 psc=36-1
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Toggle; //输出比较触发模式
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //TIM1 OutputState选择输出比较状态
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable; //TIM1 OutputNState 选择互补输出比较状态 TIM_OCInitStructure.TIM_Pulse = 0 ;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //设置TIM1通道1输出极性高
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High; // 设置TIM1互补通道1输出极性高 TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set; //当MOE=0时,设置TIM1输出比较空闲状态
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset; //当MOE=0时,重置TIM1互补通道输出比较空闲状态
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
//TIM1_OC2模块设置(设置2通道的相位差为90度)
TIM_OCInitStructure.TIM_Pulse = ((500000/fval)-1); //设置待装入捕获寄存器的值为((500000/fval)-1)
TIM_OC2Init(TIM1,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_Cmd(TIM1,ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}[/mw_shl_code]
引入函数改变arr的值之后的仿真截图(频率没有变化,一直是100Hz(理论上应该是每隔100ms,频率改变一次,频率从100Hz增大到1000Hz,之后又减小到100Hz)):
|