完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一,何为PWM?
PWM的全称为:Pulse Width Modulation,简称脉宽调制 百度来的:脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。 而简单的来说就是,我们可以使用处理器输出自己想要的占空比的矩形波,去达到控制模拟电路等目的。 二,STM32中拥有PWM 在STM32F407的芯片手册中有描述:12个16位的定时器,2个32位的定时器,每个定时器可以由4个通道去产生PWM 三,STM32中的PWM的原理 先说PWM的关键指标:周期,以及占空比 1.PWM周期:就是通过配置定时器的溢出时间(即图中ARR的值),当计数器(CNT寄存器)计数的值与ARR的值相等时,计数归零,重新计数 2.PWM占空比:设置CRRx的值,作为比较值,CNT计数值与CRR做对比,因此衍生出PWM的模式, 如:在PWM模式1,当计数器CNT 上图就是设置输出通道极性为低,CRRx为150,ARR为500 可以看到当小于150时表现出来的为低电平,否则就是为高电平。 四.PWM的配置流程如下 1.使能GPIO时钟,配置一个GPIO结构体变量(该GPIO上可以复用为定时器的输出),并进行初始化 2.将GPIO的引脚复用为TIM的输出 3.使能定时器时钟,配置一个TIM结构体变量,主要关注设置Arr的值,并进行初始化 4.配置TIM_OCInitTypeDef结构体,用于输出比较的结构体, /** * @brief TIM Output Compare Init structure definition */ typedef struct { uint16_t TIM_OCMode; /*!< Specifies the TIM mode. This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ uint16_t TIM_OutputState; /*!< Specifies the TIM Output Compare state. This parameter can be a value of @ref TIM_Output_Compare_State */ uint16_t TIM_OutputNState; /*!< Specifies the TIM complementary Output Compare state. This parameter can be a value of @ref TIM_Output_Compare_N_State @note This parameter is valid only for TIM1 and TIM8. */ uint32_t TIM_Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. This parameter can be a number between 0x0000 and 0xFFFF */ uint16_t TIM_OCPolarity; /*!< Specifies the output polarity. This parameter can be a value of @ref TIM_Output_Compare_Polarity */ uint16_t TIM_OCNPolarity; /*!< Specifies the complementary output polarity. This parameter can be a value of @ref TIM_Output_Compare_N_Polarity @note This parameter is valid only for TIM1 and TIM8. */ uint16_t TIM_OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. This parameter can be a value of @ref TIM_Output_Compare_Idle_State @note This parameter is valid only for TIM1 and TIM8. */ uint16_t TIM_OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State @note This parameter is valid only for TIM1 and TIM8. */ } TIM_OCInitTypeDef; 主要注意一下几样: TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //PWM的输出模式 TIM_OCInitStructure.TIM_OutputState=ENABLE; //使能 TIM_OCInitStructure.TIM_Pulse=250; //脉冲,即与CNT比较的数值 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //输出极性,与PWM模式配合,产生最后的输出 TIM_OC1Init(TIM14,&TIM_OCInitStructure); 因此最后还要再调用两个函数 TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM14,ENABLE); 最后实现PWM的初始化代码如下: /** * @brief the TIM14 used to produce a PWM * @param arr: TIM重装载计数值 * @param psc: 分频系数 * @param pluse:初始化占空比设置 * TIM_SetCompare1() ¸该函数可以动态改变占空比的值 * @retval None */ void INIT_PWM(int arr,int psc,int pluse) { //使能GPIOF的外设时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //声明一个GPIO结构体变量 GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; // LED所在的IO口,定时器14 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //100MHz的时钟 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉 //初始化GPIOF GPIO_Init(GPIOF,&GPIO_InitStructure); /将GPIO复用至TIM14 GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //使能定时器14的外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE); //声明一个定时器结构体变量 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_Period=499; //Tout=(ARR+1)(PSC+1)/Tclk (499+1)(83+1)/(84M)=500*(1us)=500us TIM_TimeBaseInitStructure.TIM_Prescaler=83; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //³õʼ»¯¶¨Ê±Æ÷14 TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStructure); //PWMÉèÖà TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //PWM1模式 TIM_OCInitStructure.TIM_OutputState=ENABLE; //使能至输出引脚 TIM_OCInitStructure.TIM_Pulse=250; //加载值CCR中的值 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //输出的极性 TIM_OC1Init(TIM14,&TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); //比较其重装载 TIM_ARRPreloadConfig(TIM14,ENABLE); //使能定时器的重装载 //使能定时器14 TIM_Cmd(TIM14,ENABLE); } 最后若要想动态的改变占空比,就要在主函数中调用以下函数来设置: TIM_SetCompare1(TIM14,pwmval); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1817 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1631 浏览 1 评论
1103 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
739 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1692 浏览 2 评论
1951浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
754浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
586浏览 3评论
605浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
568浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 10:47 , Processed in 0.595454 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号