完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32 输出方波的方法有两种比较类似的,一个是PWM模式,一个是输出比较模式。下面来看看这两种模式的不同处在哪。
先看看官方对两种模式的介绍 PWM模式: 输出比较模式 通过两种模式的介绍,好像不能直观的看出来具体差别在哪,再看看两种模式设置时寄存器里面的介绍。 通过CCMR寄存器中的OCM位可以看出来这两种模式的一点区别。 输出比较模式下: CCR = CNT 时,翻转输出电平。 PWM模式下: CNT < CCR时输出一种电平,CNT > CCR时输出相反的电平。 通过图片来直观的看看这两种模式的区别。 PWM模式下: ARR 决定输出频率 ,CCR决定输出占空比。 输出比较模式下: ARR 决定输出频率 CCRx 决定每个通道的初始相位。 两种模式下最主要的差别就是CCR值代表的含义不一样。PWM模式下CCR可以控制占空比。输出比较模式下CCR可以控制初始相位。 下面通过一个程序来对比一下这两种模式 #include "pwm.h" void TIM3_PWM_Init( u16 arr, u16 psc ) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE ); //使能定时器3时钟 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIO和AFIO复用功能模块时钟 //设置TIM3 CH3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init( GPIOB, &GPIO_InitStructure ); //初始化TIM3 TIM_TimeBaseInitStructure.TIM_Period = arr; TIM_TimeBaseInitStructure.TIM_Prescaler = psc; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure ); //初始化TIM3_CH3 PWM 模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init( TIM3, &TIM_OCInitStructure ); //使能TIM3在CCR2上的预装载寄存器 TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable ); //使能TIM3 TIM_Cmd( TIM3, ENABLE ); } void TIM3_CMP_Init( u16 arr, u16 psc ) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE ); //使能定时器3时钟 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE ); //使能GPIOC时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化TIM3 TIM_TimeBaseInitStructure.TIM_Period = arr; TIM_TimeBaseInitStructure.TIM_Prescaler = psc; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure ); //初始化TIM3_CH4 比较 模式 输出比较翻转触发模式(当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平) TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC4Init( TIM3, &TIM_OCInitStructure ); TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable ); //使能TIM3 TIM_Cmd( TIM3, ENABLE ); } 将定时器3通道3设置为PWM输出模式,定时器3通道4设置为输出比较模式。 #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "pwm.h" // LED0 PA8 LED1 PD2 int main(void) { u16 led_pwm_val=0; u8 dir=1; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_Init(); LED0 = 1; LED1 = 1; delay_ms(500); LED0 = 0; LED1 = 0; //比较输出模式下: ARR 决定输出频率 CCRx 决定每个通道的初始相位 //PWM模式: ARR 决定输出频率 CCRx 决定输出 的高电平时长 TIM3_PWM_Init(1000-1,72-1); //比较翻转模式,一个周期只翻转一次,所以频率为 1/2 TIM3_CMP_Init(1000-1,71-1); TIM_SetCompare3(TIM3,100); //PWM 模式 TIM_SetCompare4(TIM3,100); //比较输出模式 while(1) { delay_ms(200); LED0 = !LED0; } } 主函数中分别初始化两种模式,然后设置CCR值为相同值,看看输出波形的区别。 蓝色波形为 PWM模式输出的波形,粉色为输出比较模式输出的波形。可以看到同样的设置参数,PWM输出方波频率为1KHz,输出比较输出的方波为500Hz,说明输出比较模式的频率为PWM模式频率的1/2。 PWM输出波形的高电平为100us,周期为1000us,占空比为10%,和主函数中设置的一样。 输出比较模式输出的波形起始相位滞后于PWM波形100us,滞后相位差为PWM波形的10%,滞后相位差为本身输出波形的20%。 输出比较模式的占空比为50%,是固定的不能修改占空比。 通过上面实验可以看到,这两种模式的主要差别是。 PWM模式: ARR设置频率,CCR设置占空比,频率和占空比可以任意设置,起始相位不能设置。 输出比较模式:ARR设置频率,CCR设置相位,频率和起始相位可以任意设置,占空比不能设置。输出频率为理论计算值一半。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:40 , Processed in 0.868245 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号