脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用 向上计数时,如果此时设置的模式为当计数器的值小于CCRx的值时,输出高电平,也是PWM1模式(可以通过TIMx_CCMR1的OCxM位来配置PWM模式) 编程步骤: 代码:
PWM原理简介
微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽
度的控制,脉宽调制也叫占空比
这个图中阐述了利用高级定时器产生PWM的原理,其中
每经过一次定时器时钟周期就会+1,通过设置定时器的输出模式,可以实现,当计数器的值CNT,小于设定的CCRx的值时,输出低电平,大于时就输出高电平PWM波的占空比和周期
可以通过改变CCRx的值来改变占空比,改变ARR的值来改变周期
计算公式为:Tout= ((arr+1)*(psc+1))/Tclk;
Tclk为时钟周期,psc为时钟分频因子PWM波形时间计算
Tout= ((arr+1)*(psc+1))/Tclk
得Tout=5ms
(相当于把公式Tout= ((arr+1)*(psc+1))/Tclk里的arr的值取0所算出来的时间)PWM程序
#include "stm32f10x.h" #include "bsp_systick.h" void TIM8_PWM_Config(uint16_t Arr, uint16_t Psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); //使能TIM8的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能 GPIO 的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //配置GPIO //设置该引脚为复用输出功能,输出 TIM8 CH1 的 PWM 脉冲波形 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化TIM8 TIM_TimeBaseStructure.TIM_Period = Arr; //设置自动重装载的值 TIM_TimeBaseStructure.TIM_Prescaler = Psc; //设置预分频系数 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置向上计数(累加)计数模式 //至此,定时器就能正常工作了,此时的溢出时间也就是周期为:Tout= ((arr+1)*(psc+1))/Tclk 这里的Tclk为72MHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟的分频因子,仅对电路的稳定性有影响 TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //初始化TIM8 //初始化 TIM8 Channel2 PWM 模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 选择PWM模式2, /*在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为 有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平, 否则为无效电平。*/ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置极性,输出有效电平为:高电平 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能 TIM_OC1Init(TIM8, &TIM_OCInitStructure); //初始化外设 TIM8 OC1 TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能预装载寄存器 TIM_Cmd(TIM8, ENABLE); //使能 TIM8 TIM_CtrlPWMOutputs(TIM8, ENABLE); //主输出使能,当使用的是通用定时器时,这句不需要 } int main(void) { uint16_t val=0;//必须16位 uint8_t dir=1; TIM8_PWM_Config(999,71); while (1) { delay_ms(10); if(dir) val++; else val--; if(val>399) dir=0; if(val<=0) dir=1; TIM_SetCompare1(TIM8,val);//设置的是CCRx的值,也就是设置占空比 } }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算