单片机学习小组
登录
直播中
王彬
7年用户
1049经验值
私信
关注
如何对PWM波进行配置呢
开启该帖子的消息推送
单片机
PWM波
STM32
如何去实现
STM32
pwm同时输出输出四道方波呢?如何对PWM波进行配置呢?
回帖
(1)
曹珉
2022-2-28 14:44:50
stm32 pwm同时输出输出四道方波
主要是在正点原子PWM输出实验的基础上修改所得
原本的代码
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}
通过if判断led0pwmval的值实现从0到300的占空比的改变,这里着重强调一下TIM_SetCompare2函数的2指的是输出TIM3的通道2的波,若要使用其他通道则使用TIM_SetCompare1||TIM_SetCompare3||TIM_SetCompare4。
这次的作业要求是输出四路同步的PWM波要求两路为100KHz,占空比为25%,两路为2KHz,占空比为50%;整个周期分为四个阶段sig1在T1为高电平,sig2在T2为高电平,sig3在T1~T2为高点平, sig4在T3~T4为高点平.
首先根据输出频率的不同,我们在main中,额外添加TIM3_PWM_Init(720-1,0); TIM2_PWM_Init(36000-1,0);
分别配置定时器2与定时器3的输出频率为2k和100k;
在while中我们添加了`:
TIM_SetCompare2(TIM3,180);
TIM_SetCompare1(TIM3,540);
TIM_SetCompare3(TIM2,18000);
TIM_SetCompare4(TIM2,18000);
来配置定时器2的通道3和通道4;定时器3的通道1和通道2;这时我们已经打完了在主函数中的内容。
接下来我们开始写timer.c中的内容
有关定时器2中断的配置与定时器3基本相似,这里不再进行赘述。
在timer.c中主要修改的内容在TIM3_PWM_Init()
我们将在这个函数中通过
RCC_APB1PeriphClockCmd //使能定时器时钟
RCC_APB2PeriphClockCmd //使能GPIO外设与IO口的复用
GPIO_PinRemapConfig() //将Timer3的部分重映射到GPIO口上
GPIO_Init() //配置IO口
TIM_TimeBaseInit() //设置时钟频率、预分频等 初始化TIM3
TIM_OC1PreloadConfig() //注意这里是使能通道1,不同的通道 TIM_OCx x的数值不同要与在main.c中的通道匹配 初始其PWM模式
这里的这个函数时可以重复使用的比如先配置完定时器2的通道1后再使用一次去配置定时器3的通道1,这
里的变量设置我在后面的代码片里会贴出来
以上为timer.c中需要配置的全部内容,主要要注意的方面
注意输出的IO口要与定时器的通道匹配
IO口与定时器的重映射模式要改为FullRemap(完全重映射)GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //我也不知道为啥部分重映射不行,希望了解的大佬能在评论区讲下,多谢。
TIM_OC1PreloadConfig注意使能的通道要与使用的通道相匹配。
关于PWM波的具体配置
配置PWM波主要配置的就是几个参数
TIM3_PWM_Init(arr,psc)中的arr寄存器设置PWM波频率
TIM_SetCompare1(TIMx,ccr)中的ccr寄存器设置PWM波的占空比,占空比=ccr/arr
在timer.c中对变量TIM_OCInitStructure的配置
分别为 TIM_OCMode //定时器模式
TIM_OutputState //比较输出使能
TIM_OCPolarity //输出极性
其中关于定时器模式和输出极性的配置和TIM_TimeBaseStructure.TIM_CounterMode是影响GPIO输出搞起电平的主要参数
具体参看正点原子的PWM输出实验PPT或中文参考手册里面写的很详细。
一下为timer.c中的部分配置代码
void TIM2_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
}
stm32 pwm同时输出输出四道方波
主要是在正点原子PWM输出实验的基础上修改所得
原本的代码
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}
通过if判断led0pwmval的值实现从0到300的占空比的改变,这里着重强调一下TIM_SetCompare2函数的2指的是输出TIM3的通道2的波,若要使用其他通道则使用TIM_SetCompare1||TIM_SetCompare3||TIM_SetCompare4。
这次的作业要求是输出四路同步的PWM波要求两路为100KHz,占空比为25%,两路为2KHz,占空比为50%;整个周期分为四个阶段sig1在T1为高电平,sig2在T2为高电平,sig3在T1~T2为高点平, sig4在T3~T4为高点平.
首先根据输出频率的不同,我们在main中,额外添加TIM3_PWM_Init(720-1,0); TIM2_PWM_Init(36000-1,0);
分别配置定时器2与定时器3的输出频率为2k和100k;
在while中我们添加了`:
TIM_SetCompare2(TIM3,180);
TIM_SetCompare1(TIM3,540);
TIM_SetCompare3(TIM2,18000);
TIM_SetCompare4(TIM2,18000);
来配置定时器2的通道3和通道4;定时器3的通道1和通道2;这时我们已经打完了在主函数中的内容。
接下来我们开始写timer.c中的内容
有关定时器2中断的配置与定时器3基本相似,这里不再进行赘述。
在timer.c中主要修改的内容在TIM3_PWM_Init()
我们将在这个函数中通过
RCC_APB1PeriphClockCmd //使能定时器时钟
RCC_APB2PeriphClockCmd //使能GPIO外设与IO口的复用
GPIO_PinRemapConfig() //将Timer3的部分重映射到GPIO口上
GPIO_Init() //配置IO口
TIM_TimeBaseInit() //设置时钟频率、预分频等 初始化TIM3
TIM_OC1PreloadConfig() //注意这里是使能通道1,不同的通道 TIM_OCx x的数值不同要与在main.c中的通道匹配 初始其PWM模式
这里的这个函数时可以重复使用的比如先配置完定时器2的通道1后再使用一次去配置定时器3的通道1,这
里的变量设置我在后面的代码片里会贴出来
以上为timer.c中需要配置的全部内容,主要要注意的方面
注意输出的IO口要与定时器的通道匹配
IO口与定时器的重映射模式要改为FullRemap(完全重映射)GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //我也不知道为啥部分重映射不行,希望了解的大佬能在评论区讲下,多谢。
TIM_OC1PreloadConfig注意使能的通道要与使用的通道相匹配。
关于PWM波的具体配置
配置PWM波主要配置的就是几个参数
TIM3_PWM_Init(arr,psc)中的arr寄存器设置PWM波频率
TIM_SetCompare1(TIMx,ccr)中的ccr寄存器设置PWM波的占空比,占空比=ccr/arr
在timer.c中对变量TIM_OCInitStructure的配置
分别为 TIM_OCMode //定时器模式
TIM_OutputState //比较输出使能
TIM_OCPolarity //输出极性
其中关于定时器模式和输出极性的配置和TIM_TimeBaseStructure.TIM_CounterMode是影响GPIO输出搞起电平的主要参数
具体参看正点原子的PWM输出实验PPT或中文参考手册里面写的很详细。
一下为timer.c中的部分配置代码
void TIM2_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
}
举报
更多回帖
rotate(-90deg);
回复
相关问答
单片机
PWM波
STM32
如何对STM32F1
PWM
外设的寄存器
进行
配置
呢
2021-11-15
776
如何对STM32的
PWM
通道
进行
配置
呢
2021-11-08
2487
怎样使用计算法得到呼吸曲线
PWM
波
和SPWM
波
呢
2022-02-17
1491
怎样去测量
PWM
波
的占空比
呢
2021-10-19
1948
如何用
PWM
波
去控制舵机
呢
2022-03-01
1185
如何使用STM32的定时器捕获功能来测量
PWM
波
呢
2021-11-17
1124
STM32CUbeMX的两路互补
pwm
波
该怎样去设置
呢
2022-02-17
1551
怎样使用stm32f334的Hrtim定时器去创建多路互补
pwm
波
呢
2021-10-19
2050
stm32f407输出
pwm
波
的
配置
步骤有哪些
2021-10-25
1844
请问
PWM
波
怎么变成双极性
波
?
2019-06-11
1455
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分