历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2019年01月15日 | STM32的PWM的原理与使用

2019-01-15 来源:eefocus

1、PWM是什么?


    就是脉冲宽度调制,简称脉宽调制。利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,就是对脉冲宽度的控制。


    这里说的脉冲,就是我们产生的方波。方波就是N个这样的周期连续的产生。


一个周期内高电平持续的时间就是脉冲宽度(脉宽),而PWM(脉冲宽度调制)就是控制一个周期内的高电平的持续时间。


----------------------------------------------------------------------------------------------------------------------------------------


2、简单的PWM的原理示意图


CNT:是当前值寄存器,计数寄存器。


ARR:是自动重载寄存器(初始化设定)。


CCRx:比较值寄存器(TIM_SetCompare1()设定修改占空比)。


 


假定定时器工作在向上计数PWM模式下:


当CNT


当CNT的值小于CCRx的时候,IO输出低电平(0),


当CNT值大于或等于CCRx的时候,IO输出高电平(1),


当CNT的值达到ARR的时候,就会重新归零,然后重新向上计数,依次循环。


改变CCRx的值就可以改变PWM的输出的占空比。改变ARR的值,就可以改变PWM的输出的频率,这就是PWM的输出原理。


----------------------------------------------------------------------------------------------------------------------------------------------------------------


3、寄存器工作流程:



PWM 模式


脉冲宽度调制模式可以生成一个信号,该信号频率由 TIMx_ARR 寄存器值决定,其占空比则


由 TIMx_CCRx 寄存器值决定。


通过向 TIMx_CCMRx 寄存器中的 OCxM 位写入 110(PWM 模式 1)或 111(PWM 模式 2) ,


可以独立选择各通道 (每个 OCx 输出对应一个 PWM)的 PWM 模式。必须通过将


TIMx_CCMRx 寄存器中的 OCxPE 位置 1 使能相应预装载寄存器,最后通过将 TIMx_CR1


寄存器中的 ARPE 位置 1 使能自动重载预装载寄存器(在递增计数或中心对齐模式下)。


由于只有在发生更新事件时预装载寄存器才会传送到影子寄存器,因此启动计数器之前,必


须通过将 TIMx_EGR 寄存器中的 UG 位置 1 来初始化所有寄存器。


OCx 极性可使用 TIMx_CCER 寄存器的 CCxP 位来编程。既可以设为高电平有效,也可以


设为低电平有效。 OCx 输出通过将 TIMx_CCER 寄存器中的 CCxE 位置 1 来使能。有关详


细信息,请参见 TIMx_CCERx 寄存器说明


在 PWM 模式(1 或 2)下, TIMx_CNT 总是与 TIMx_CCRx 进行比较,以确定是


TIMx_CNT =< TIMx_CCRx。


因为计数器采用递增方式计数,所以定时器能够在边沿对齐模式下生成 PWM。


----------------------------------------------------------------------------------------------------------------------------------------------------------------


4、PWM 边沿对齐模式


以下以 PWM 模式 1 为例。只要 TIMx_CNT < TIMx_CCRx, PWM 参考信号 OCxREF 便为


高电平,否则为低电平。如果 TIMx_CCRx 中的比较值大于自动重载值(TIMx_ARR 中),


则 OCxREF 保持为“1”。如果比较值为 0, 则 OCxRef 保持为“0”。 图 183 举例介绍边


沿对齐模式的一些 PWM 波形 (TIMx_ARR=8)。



----------------------------------------------------------------------------------------------------------------------------------------------------------------


5、PWM步骤-灯光亮度控制:


       查看LED的原理图:



        //①根据原理图找到4个引脚:

       PF9可以使用TIM14_CH1,表示可以使用定时器14的通道1产生PWM输出。

        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; // 定义的TIM属性结构体变量

      GPIO_InitTypeDef GPIO_InitStruct; // 定义GPIO类型变量

       TIM_OCInitTypeDef TIM_OCInitStruct; // 定义复用功能的变量

     

       ②// 1.初始化时钟:TIM14 和 PF9

       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

 

       /* TIM3 clock enable */

     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);

    

       // 2.配GPIO引脚为复用功能

       /* GPIOC Configuration: TIM14 CH1 (PF9) */

       GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // 选择引脚为PF9

       GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 设置为复用功能

       GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed; // 设置输出速度为100MHz

       GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置为推挽输出

       GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 设置为上拉输出

       GPIO_Init(GPIOC, &GPIO_InitStruct);  // 安装参数

 

       // 3.将TIM和引脚的复用功能连接:TIM14和PF9连接起来

       GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);

 

       // 4.配置TIM定时器的参数

       TIM_TimeBaseInitStruct.TIM_Period = 100-1; // 设置重装载值 ARR(控制频率)

       TIM_TimeBaseInitStruct.TIM_Prescaler = 8400-1; // 设置预分频系数:周期(次) 100Hz == 100us

       TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 设置再分频值:TIM_CKD_DIV1就是不分频

       TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数模式

       TIM_TimeBaseInit(TIM14, &TIM_TimeBaseInitStruct);

      

       // 5.配置复用功能:PWM

       TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // 配置为PWM模式1

       TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 开启输出使能

       //TIM_OCInitStruct.TIM_Pulse = CCR1_Val; // 初始化配置比较值寄存器

       TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 配置为高电平有效

 

       // 6.TIM14通道1初始化

       TIM_OC1Init(TIM14, &TIM_OCInitStruct); // TIM14通道1初始化

 

       // 7.设置自动重载比较值CCR1初值,不断产生PWM脉冲

       TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);

 

 

       // 8.设置自动重装载值(ARR),不断产生PWM脉冲

       TIM_ARRPreloadConfig(TIM14, ENABLE);

 

       /* 9.使能定时器14 */

       TIM_Cmd(TIM14, ENABLE);

 

       // 10.使能TIM1PWM输出(高级定时器)

       //TIM_CtrlPWMOutputs(TIM1, ENABLE)

 

设置比较值函数


void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Comparex);


推荐阅读

史海拾趣

Ceratech Corporation公司的发展小趣事

随着全球化进程的加速推进,Ceratech Corporation公司意识到要想在激烈的国际竞争中立于不败之地,必须实施全球化战略。公司开始积极拓展海外市场,通过建立海外分公司、参加国际展会等方式,加强与国际同行的交流与合作。同时,公司还积极引进国际先进的技术和管理经验,不断提升自身的创新能力和管理水平。通过全球化战略的实施,Ceratech Corporation逐渐成为了国际电子行业中的佼佼者。

联智(Celfras)公司的发展小趣事

为了扩大品牌影响力,联智积极参与国际展会和交流活动。例如,公司曾参加2020无线充电亚洲展,并设立展位与观众进行深入交流。这种面对面的交流方式使联智能够更直接地了解市场需求和行业动态,同时也为公司提供了展示自身技术和产品的机会。通过参与国际展会,联智不仅提升了品牌知名度,还建立了广泛的合作伙伴关系,为公司未来的发展奠定了坚实基础。

以上五个故事均基于公开资料对联智(Celfras)公司发展历程的简述,旨在展现公司在电子行业的成长和贡献。每个故事都尽量保持了客观性和中立性,避免了对公司的主观评价。

Cypress(赛普拉斯)公司的发展小趣事

Cypress在USB技术领域取得了显著的成就。自1996年开始深耕USB产品以来,Cypress逐渐成为了USB领域内的领先者。公司推出的EZ-PD系列产品是业界第一个支持USB PD 3.0供电规范的解决方案,赢得了市场的广泛认可。此外,Cypress还不断推出新的USB产品和技术,推动了USB技术的不断发展和创新。

Extech公司的发展小趣事

随着制造业信息化的发展,企业对信息化解决方案的需求日益迫切。为了满足客户的需求,Extech公司在2003年相继推出了XTMES、XTPLM等产品,并在国内首次提出了“一体化解决方案”的概念。这一解决方案覆盖了制造业信息化的各个环节,为客户提供了全方位的信息化服务。通过这一解决方案的推出,Extech公司在制造业信息化领域进一步扩大了自己的市场份额。

Faraday Technology公司的发展小趣事

随着制造业信息化的发展,企业对信息化解决方案的需求日益迫切。为了满足客户的需求,Extech公司在2003年相继推出了XTMES、XTPLM等产品,并在国内首次提出了“一体化解决方案”的概念。这一解决方案覆盖了制造业信息化的各个环节,为客户提供了全方位的信息化服务。通过这一解决方案的推出,Extech公司在制造业信息化领域进一步扩大了自己的市场份额。

迪一电子公司的发展小趣事

随着市场的不断变化和技术的快速发展,迪一电子公司意识到必须不断创新才能保持竞争力。于是,公司加大研发投入,引进高端技术人才,与国内外知名科研机构合作,成功研发出一系列具有竞争力的新产品。这些新产品不仅提高了公司的市场占有率,还为公司赢得了良好的口碑。

问答坊 | AI 解惑

新成员向大家问好

用心搜索,,用手去描写,大家好,!!!…

查看全部问答>

单片机做的智能台灯

单片机做的智能台灯…

查看全部问答>

基于CPLD的容错存储器的设计实现

摘 要: 分析了存储器产生错误的原因,提出了提高其可靠性的有效途径。结合航天计算机可靠性增长计划,给出了一套利用纠检错芯片对其进行容错的方案,并给出了通过CPLD器件实现的仿真结果。最后对容错存储器的可靠性进行了分析。 关键词: 容错; ...…

查看全部问答>

CPU板器件、液晶及PCB收到,焊接完成

CPU板器件、液晶及PCB收到,一个晚上终于焊接完成,不多说了,上图。 [ 本帖最后由 disheng 于 2009-8-2 00:46 编辑 ]…

查看全部问答>

步进电机正反转为什么有快慢?

我写了这么一个程序用于控制步进电机,通过改变flag的值来改变电机的转向,但为什么两个转向的速度有很明显的不一致? #include unsigned char code Forward[4]={0xf1,0xe9,0xe5,0xe3}; unsigned char code Back[4]={0xf1,0xe3,0xe5,0xe9}; uns ...…

查看全部问答>

用gprs传数据,用dtu呢还是modem呢

小弟要把现场由单片机采集的232数据传到上位计算机;中间传输计划用gprs。现打算买模块,却听某大大说,传数据用dtu不用modem。 小弟应该买dtu呢还是modem呢?有没有做过类似应用的前辈简单介绍下总体情况,在下感激不尽啊。 还有就是,市面 ...…

查看全部问答>

构造原型系统的八大原则 对自己的产品设计很有帮助

不必担心!有成功之路可循!如果您可以演示,或者如果能给客户提供原型系统就更好了,并得到关于创新价值的真实反馈,那么您获得商业成功的可能性会大为提高。如果您希望创建企业实现自己的产品构思,请开发原型系统并牢记下列八大原则。 1、认识 ...…

查看全部问答>

今年5.1放假干嘛去?(参加嵌入式Linux免费体验活动去!)

《嵌入式Linux免费体验班》(1天) 今年5.1放假干嘛去?参加嵌入式Linux免费体验活动!       ————————名额有限,限定12人,先报先得! 课程目标: 本课程针对嵌入式Linux开发的初学人员,能快速了解嵌入式Lin ...…

查看全部问答>

S51 isp下载线问题

我按照网上聂中强的电路图,焊了一个isp并口下载线, 用ispTest测试正常,编程器就绪。 S51的电源正常, 晶振两脚(18:1.76V, 19:2.14V,应该可以吧!), 31脚的Vpp:5V , 复位时,我用一根电线直接搭Rst 和 Vcc,然后放开。 用Easy51Pro看起 ...…

查看全部问答>

maple 中断和电池接口介绍

1.电池接口maple的电池接口使用最常用的2mm脚距接头在连接时注意正负的方向不要弄反了,在板子上印有正负的符号2.中断的使用在maple中中断十分简单attachInterrupt(引脚编号,处理的函数,触发方式);触发方式有FALLING   RISING  和&n ...…

查看全部问答>