OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4694|回复: 2

【新手求助】定时器输出比较模式输出相位可变PWM波,低频相位可调,高频相位不可调

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-4-1
在线时间
2 小时
发表于 2022-5-14 20:13:43 | 显示全部楼层 |阅读模式
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()函数为什么不能起作用?

再次谢谢各位大佬了!

1.png
2.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-5-16 10:11:35 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2022-5-17 01:39:57 | 显示全部楼层
输出比较模式只能用于频率较低的场合,高了搞不定
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 04:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表