新手入门
- 积分
- 5
- 金钱
- 5
- 注册时间
- 2022-4-1
- 在线时间
- 2 小时
|
2金钱
我想得到相位可调的PWM波,仿真环境中低频时相位是设置成功的,但是在高频的时候好像不能移动相位,请问大佬们问题出在哪儿?硬件:STM32F103ZET6
具体细节:


我的相关代码:
void TIM4_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能定时器TIM4时钟,注意TIM4时钟为APB1,而非APB2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
//使能PWM输出GPIO口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//定时器TIM4的PWM输出通道1,TIM4_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//定时器TIM4的PWM输出通道1,TIM4_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//定时器TIM4的PWM输出通道3,TIM4_CH3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//定时器TIM4的PWM输出通道2,TIM4_CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
TIM_TimeBaseStructure.TIM_Period = arr;//自动重装值
TIM_TimeBaseStructure.TIM_Prescaler = psc; //时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化TIM4
//初始化TIM4_CH1的PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;//设置PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性为高
TIM_OC1Init(TIM4, &TIM_OCInitStructure);//初始化TIM4_CH1
//初始化TIM4_CH2的PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//TIM4_CH2初始化,注意为OC2,而不是OC1,下面两个通道依次类推。
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
//初始化TIM4_CH3的PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
//初始化TIM4_CH4的PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
//使能4个通道的预装载寄存器
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC1
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC2
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC3
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC4
TIM_ARRPreloadConfig(TIM4, ENABLE); //使能重装寄存器
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_ITConfig(TIM4,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3,ENABLE);
TIM_Cmd(TIM4, ENABLE);//使能定时器TIM4,准备工作
}
主函数相关代码:
TIM4_PWM_Init(20,0);//方波频率1Hz
TIM_SetCompare1(TIM4,1);//PWM模式:TIM_OCMode_Toggle 偏移相位设置
TIM_SetCompare2(TIM4,2);//
TIM_SetCompare3(TIM4,6);//
TIM_SetCompare4(TIM4,7);//
问题:
void TIM4_PWM_Init(u16 arr,u16 psc);函数arr值较小时,TIM_SetCompareX()函数为什么不能起作用?
再次谢谢各位大佬了!
|
-
-
|