电机控制基础知识1—定时器基础知识与PWM输出原理

发布者:Joyful888Life最新更新时间:2024-07-11 来源: elecfans关键字:电机控制  定时器  PWM输出 手机看文章 扫描二维码
随时随地手机看文章

TIM_Cmd(TIM3, ENABLE); /*使能TIM3:使能控制寄存器CR的第0位:CEN, counter enable*/

关于配置CCMR1、CCER寄存器


  • 关于配置CCMR1、CCER寄存器

CCMR1:

pYYBAGDKIqqAaLK0AABGDNkRr5A165.png

CCER:pYYBAGDKIq6AAk4_AAAqgbJouDE968.png

TIM_OC1Init

函数对应于输入通道的初始化,其实就是操作

CCMR1

CCER

等寄存器:


void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

{

 uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;

 TIMx->CCER &= (uint16_t)~TIM_CCER_CC1E;/* 关闭通道1: 复位CC1E位 */

 

 tmpccer = TIMx->CCER;/* 获取 TIMx CCER 寄存器的值 */

 tmpcr2 = TIMx->CR2; /* 获取 TIMx CR2 寄存器的值 */


 tmpccmrx = TIMx->CCMR1;/* 获取TIMx CCMR1 寄存器的值 */

 tmpccmrx &= (uint16_t)~TIM_CCMR1_OC1M;  /* 复位输出比较模式OC1M位 */

 tmpccmrx &= (uint16_t)~TIM_CCMR1_CC1S;

 tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;/* 设置为输出比较模式 */

 

 tmpccer &= (uint16_t)~TIM_CCER_CC1P;     /* 复位输出极性CC1P */

 tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; /* 设置输出极性 */

 tmpccer |= TIM_OCInitStruct->TIM_OutputState; /* 设置输出状态 */

  

 if((TIMx == TIM1) || (TIMx == TIM8)) /*高级定时器的特殊配置*/

 {

  //省略。。。

 }

 

 TIMx->CR2 = tmpcr2;   /* 写数据到TIMx的CR2寄存器 */

 TIMx->CCMR1 = tmpccmrx; /* 写数据到TIMx的CCMR1寄存器 */

 TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse;/* 设置CCR1寄存器 */

 TIMx->CCER = tmpccer; /* 写数据到TIMx的CCER寄存器 */

}


4.2 动态改变占空比

占空比是通过修改CCR寄存器的值进行修改的,如果定时器初始化时只设置了1次CCR的值,那么会输出恒定占空比的PWM波;如果在定时器运行的时候,动态修改CCR的值,则可以实现PWM占空比的动态调整。


如下程序,实现了每隔10ms对占空比进行一次修改,每次将高电平计数值增加5,当增大道500(占空比100%)时,再逐渐减小到0(占空比0%),不断循环。


u16 led0pwmval=0;  

u8 dir=1;

TIM3_PWM_Init(500-1,84-1); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. 

while(1) //实现比较值从0-500递增,到500后从500-0递减,循环

{

  delay_ms(10);


  if(dir)

  {

    led0pwmval+=5; //dir==1 led0pwmval递增

  }

  else 

  {

    led0pwmval-=5; //dir==0 led0pwmval递减 

  }

  if(led0pwmval>500)

  {

    dir=0;     //led0pwmval到达500后,方向为递减

  }

  if(led0pwmval==0)

  {

    dir=1;    //led0pwmval递减到0后,方向改为递增

  }


  TIM_SetCompare1(TIM3,led0pwmval); /*CCR 修改比较值(占空比)*/

}


5 测试效果

将程序下载到板子,我用的一块STM32F407的板,A6引脚上接了一个LED灯,实际效果的LED逐渐变凉,在逐渐变暗,依次循环。


再通过逻辑分析仪来查看实际的输出波形,如下图,测得的pwm周期0.5ms(频率2kHz),与软件中设定的一致。


在某一时刻,脉宽55us。


pYYBAGDKIq-ASDYcAACEfEpPrUY599.png

在另一时刻,脉宽0.365ms,即实现了PWM脉宽的动态调整。


poYBAGDKIrCAYsb1AABa3255Zi0464.png


[1] [2]
关键字:电机控制  定时器  PWM输出 引用地址:电机控制基础知识1—定时器基础知识与PWM输出原理

上一篇:使用FSMC接口来驱动8080接口LCD屏的问题
下一篇:低功率马达控制板STEVAL-IHM036V1的性能特性及应用电路分析

推荐阅读最新更新时间:2024-11-13 19:28

AVR单片机定时器TIME0普通定时实验程序
/*很简单的问题费了好大的劲,注意中断向量地址和向量号的区别,*/ /*这样的是时钟节拍可以搞到微秒级的,太好了这样对以后搞操作系统是很管用的,节拍直接影响CPU的利用效率*/ /*节拍器越小,时间片就越准确,对于整个系统的统一是绝对有意义的,*/ /*AVR定时器普通定时实验 0415 天津第四项目部宿舍 */ #include iom16v.h #define uchar unsigned char #define uint unsigned int #define set_bit(a,b) a|=(1 b) #define clr_bit(a,b) a&=(1 b) #define get_bit(a,b) a&(
[单片机]
STM32之系统时基定时器中如何完成按键防抖动问题
在按键演示防抖动部分的主要思路是:利用系统定时器溢出间隔中断来延时防抖。这样做可以提高代码的执行效率。我们怎么去很好的利用这个系统定时器来延时呢?如果只是简单在系统定时器中断中置位延时标志位,没有任何意义,我们需要有一个标志位来允许置延时标志。第一次扫描到有按键按下时,延时标志肯定为空,那么在此置位一个标志位,来允许系统定时器中置位延时标志,就解决了这个问题。 软件的逻辑结构是:如果没有延时,则置位允许延时标志置位标志。首先是置位标志位,如果置位了,在系统定时器溢出中断中,就可以置位延时标志位。如果已经置位,处理按键值。 下面给出一个在按键处理中的对延时标志判断的处理。 if(key_bit & 0x02) //如果按键没有被处理
[单片机]
AVR单片机I/O口、定时器和按键编程总结
首先,用到了定时器2的溢出中断,用于控制灯的闪烁。在这部分程序的设计中,遇到的困难是当灯一旦闪烁起来,就无法控制其它的内容了。后来明白是由于中断服务程序太长,没等执行完计数器就计满了,然后就一直的在执行闪烁程序,导致无法在执行其它命令。最开始在每次延迟函数之后令计数器置零,可是还是没有起到太大效果,因为最长的延迟函数为2s,时间太长,最后经考虑,在进入中断服务程序的时候,屏蔽定时器2溢出中断,在离开之前再使能,然后再令计数器置零,结果实现了所要的结果。 第二个问题就是关于按键。要求相应的I/O口即能做输出,又能做输入,能够用按键控制。似乎很简单的一个程序,可是第一次做也遇到不少问题。当按下相应的按键,就给data赋一个值,去实现不同
[单片机]
东芝为电机控制应用推出内嵌新矢量引擎的微控制器
东芝公司(Toshiba Corporation)近日宣布,该公司内嵌新矢量引擎的微控制器“TMPM375FSDMG”即日起投入量产。该产品专为电机应用打造,也是基于ARM CortexTM-M3内核的TX03系列中的最新成员。 新矢量引擎是东芝独创的协处理器,可独立处理电机的矢量控制,让主处理器能够用于系统控制和通信,从而提高应用的总体性能。协处理器采用紧凑的SSOP30封装,能够在空间关键型应用中使用,如装配在电机内。 应用 洗衣机、空调和冰箱等家电;电机和泵;售货机和ATM机。 产品主要特性 1. 新的内置矢量引擎 东芝已经开发出了一种“新矢量引擎”,可提高原“矢量引擎”的相位转换、坐标转换和比例积分
[单片机]
51定时器中断的方式进行定时实例
#include sbit LED_1 = P1^1; void initT0(void) { TMOD = 0x01; //选择T0 工作方式1,16位定时/计数器,TR0直接开关 TH0 = 0xFC; TL0 = 0x18; //1ms EA = 1; //开总中断 ET0 = 1; //开T0中断 TR0 = 1; //开定时器T0 } //T0中断服务程序1 void Timer0Int(void) interrupt 1 { TH0 = 0xFC; TL0 = 0x18; LED_1 = ~LED_1; } int main(void) { initT0(); while(1) { } }
[单片机]
使用我们的数字信号控制器简化您的电机控制设计
当我们考虑电机和使用电机的地方时,我们最常想到的是汽车和其他类似的交通方式,如电动摩托车、电动自行车和电动滑板车。但我们并不总是记得电机存在于日常家居用品中,例如吸尘器、电动工具和家用电器。我们的数字信号控制器 (DSC) 解决方案专注于家用电器、汽车、消费电子和工业控制的四个主要电机控制市场。 对于家用电器,dsPIC DSC提供高度集成的低成本器件,采用小型封装,包括可以使用单个dsPIC DSC控制两个电机的器件。 对于汽车应用,dsPIC DSC提供扩展和高温范围以及全5V器件,以支持引擎盖下应用。 对消费和工业应用的支持包括用于高效率的磁场定向控制 (FOC) 算法、用于最大化电机扭矩的最大每安培扭矩 (MT
[嵌入式]
STM32之系统时钟基定时器
STM32F10x内核中都具有一个系统时钟基定时器,是一个24位的递减计数器。在其设置处置并使能后,每经过一个系统时钟周期,计数值减1.档计数值减到0时系统时基定时器又会自动重载初值。 系统时基定时器每10ms就会产生一次中断。 接下来主要介绍库函数。 1.SysTick_CLKSourceConfig函数的功能是设置SysClock的时钟源。其中输入参数为SysTick_CLKSource:SysTick时钟源 参数可取的值为:SysTick_CLKSource_HCLK_Div8;SysTick_CLKSource_HCLK.表示SysTick时钟源为AHB时钟除以8和AHB时钟源。 例:设置系统定时器时钟为AHB时钟。 Sy
[单片机]
基于STCl2C5410AD的电动车无刷电机控制器检测设计
  0 引言   伴随着城市化进程,人们生活的交通距离不断扩大,代替燃油汽车和自行车的电动车的普及大幅度的提高了电力资源的利用效率,促进了国民经济的健康发展。电动自行车以电力作动力,骑行中不产生污染,无损于空气质量。从改善人们的出行方式、保护环境和经济条件许可情况等因素综合来看,电动自行车目前乃至今后都有着广阔的发展空间。电动自行车所用直流电机分为有刷电机和无刷电机两种。其中有刷电机控制较简单。但其易磨损的电刷带来维修保养工作量相对较大、使用寿命相对较短等缺点。而直流无刷电机本身没有易磨损部件,电机寿命长,维修保养工作量小。但直流无刷电机采用电子换向原理工作,其控制过程比有刷电机复杂得多,因此对控制器质量的要求也高得多。   
[单片机]
基于STCl2C5410AD的电动车无刷<font color='red'>电机控制</font>器检测设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved