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

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

单片机开发中,电机的控制与定时器有着密不可分的关系,无论是直流电机,步进电机还是舵机,都会用到定时器,比如最常用的有刷直流电机,会使用定时器产生PWM波来调节转速,通过定时器的正交编码器接口来测量转速等。


本篇先介绍定时器的基础知识,然后对照这些知识介绍一下定时器输出PWM的基本原理,以及编程实现与代码分析。


首先来看一下定时器的基础介绍。


1 定时器基础知识

1.1 定时器种类

以STM32F4为例,一共有14个定时器:

  • 高级定时器(TIM1、TIM8)

  • 通用定时器(TIM2~TIM5,TIM9~TIM14)

    • TIM2~TIM5(通用定时器里功能较多的)

    • TIM9/TIM12

    • TIM10/TIM11和TIM13/TIM14

  • 基本定时器 (TIM6、TIM7)

pYYBAGDKIqSACxHkAABThnF_A_Q612.png

1.2 各种定时器的特性

1.2.1 高级定时器与通用定时器

这里列举高级定时器的特性,在此基础上,对比添加其与通用定时器的不同之处:

  • 16 位递增、递减、递增/递减自动重载计数器(TIM2 和 TIM5为32位)

  • 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 到 65536 之间。

  • 多达 4 个独立通道(TIM9/TIM12有2个,TIM10/TIM11,TIM13/TIM14只有1个),可用于:

    • 输入捕获

    • 输出比较

    • PWM 生成(边沿和中心对齐模式)(高级定时器和TIM2~TIM5特有,其它是只有边沿对齐模式)

    • 单脉冲模式输出

  • 带可编程死区的互补输出(高级定时器特有)。

  • 使用外部信号控制定时器且可实现多个定时器互连的同步电路(TIM10/TIM11,TIM13/TIM14没有)。

  • 重复计数器,用于仅在给定数目的计数器周期后更新定时器寄存器(高级定时器特有)。

  • 用于将定时器的输出信号置于复位状态或已知状态的断路输入(高级定时器特有)。

  • 发生如下事件时生成中断/DMA 请求:

    • 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)

    • 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)(TIM10/TIM11和TIM13/TIM14没有此功能)

    • 输入捕获

    • 输出比较

    • 断路输入(高级定时器特有)

  • 支持定位用增量(正交)编码器和霍尔传感器电路(高级定时器和TIM2~TIM5特有)。

  • 外部时钟触发输入或逐周期电流管理(高级定时器和TIM2~TIM5特有)。

1.2.2 基本定时器

基本定时器 (TIM6、TIM7)的功能比较单一,所具有的功能如下:

  • 16 位自动重载递增计数器

  • 只能定时,没有外部 IO

  • 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于 1 和 65536 之间

  • 用于触发 DAC 的同步电路

  • 发生如下更新事件时会生成中断/DMA 请求:计数器上溢

1.3 定时器使用配置

使用定时器,一般需要配置如下:

  • 时基:也就是计数器的计数时钟

  • 自动重装载值:每次计数的最大值

  • 输出通道:当需要使用定时器输出某种波形时(如PWM)

  • 输入通道:当需要使用定时器接收某种波形时(如电机编码器信号)

先来看一下定时器的原理框图,对定时器的内部原理有一个整体直观的感受:

pYYBAGDKIqWAIh8pAAGGLYA2Kn4782.png

1.3.1 时钟源

从上图可以看出,计数器的时钟源可以为:

  • 由RCC的内部时钟分频得到

  • 由定时器的TIMx_ETR引脚得到

  • 由其他定时器通过TRGO输出得到

一般使用RCC的内部时钟CK_INT,也即定时器时钟TIMxCLK,经APB1或APB2预分频器后分频提供。

关于定时器时钟源的具体细节,可以来看一下STM32F4的时钟树:

poYBAGDKIqiAFtRsAAPd564sbpY895.png

从STM32F4的内部时钟树可知:

  • 高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线(84MHZ)

  • 通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线(42MHZ)

另外:

  • 当APB1和APB2分频数为1的时候,各定时器的时钟就是对应的APB1或APB2的时钟;

  • 如果APB1和APB2分频数不为1,那么各定时器的时钟就是对应的APB1或APB2的时钟的2倍;

    由于库函数中 APB1 预分频的系数默认是 2,所以,所以TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即168MHz,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84MHz。

1.3.2 计数器时钟

由于定时器时钟的提供的可以频率较高,计数器不需要这么高的频率来计数,所以会进行降频,使用一个合适的低频时钟来计数。

定时器时钟经过PSC 预分频器之后,即CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,可以对定时器时钟TIMxCLK进行 1~65536 之间的任何一个数进行分频。

具体计算方式为:CK_CNT=TIMxCLK/(PSC+1)。

比如,使用STM32F4的通用定时器2(TIM2CLK为APB1的时钟的两倍即84MHz),PSC设置为83,则计数时钟为84MHz/(83+1)=1MHz,即1ms计一个数。

1.3.3 计数器

计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。

1.3.4 自动重装载寄存器

自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的,定时器就产生溢出中断。

2 定时器输出PWM原理

如下图是PWM输出的原理示意图:

假设定时器工作模式设置为向上计数 PWM模式,且当 CNT=CCRx 时输出 0,则:

  • 当 CNT 值小于 CCRx 的时候, IO 输出高电平 (1)

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

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

因此,改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的周期(频率),这就是利用定时器输出PWM 的基本原理。

poYBAGDKIqmAen9xAADWlMbxy2g581.png



3 定时器常用的寄存器

使用定时器来输出PWM时,需要对其寄存器进行相应的设置。定时器的寄存器有好多个,这里先介绍几个与输出PWM相关的几个寄存器,其它是寄存器以后用到时再介绍。

3.1 控制寄存器CR1

控制寄存器,就是来设置定时的工作模式:

pYYBAGDKIqmAXYlEAAAnR0tMjF4643.png

  • 位 15:10 保留,必须保持复位值。

  • 位 9:8 CKD:时钟分频 (Clock division) 此位域指示定时器时钟 (CK_INT) 频率与数字滤波器所使用的采样时钟(ETR、TIx)之间的分频比,

  • 位 7 ARPE:自动重载预装载使能 (Auto-reload preload enable)

    • 0:TIMx_ARR 寄存器不进行缓冲

    • 1:TIMx_ARR 寄存器进行缓冲

  • 位 6:5 CMS:中心对齐模式选择 (Center-aligned mode selection),包括1种边沿对齐模式与3种中心对齐模式

  • 位 4 DIR:计数器方向 (Direction),0为递增计数,1为递减计数。

    注: 当定时器配置为中心对齐模式或编码器模式时,该位为只读状态。

  • 位 3 OPM:单脉冲模式 (One-pulse mode)

  • 位 2 URS:更新请求源 (Update request source)

    此位由软件置 1 和清零,用以选择 UEV 事件源。

  • 位 1 UDIS:更新禁止 (Update disable) 此位由软件置 1 和清零,用以使能/禁止 UEV 事件生成。

  • 位 0 CEN:计数器使能 (Counter enable),0为禁止计数器,1为使能计数器

    只有事先通过软件将 CEN 位置 1,才可以使用外部时钟、门控模式和编码器模式。而触发模式可通过硬件自动将 CEN 位置 1。在单脉冲模式下,当发生更新事件时会自动将 CEN 位清零。

3.2 捕获/比较模式寄存器CCMR1

这些通道可用于输入(捕获模式)或输出(比较模式)模式。通道方向通过配置相应的 CCxS 位进行定义。此寄存器的所有其它位在输入模式和输出模式下的功能均不同。对于任一给定位

  • OCxx 用于说明通道配置为输出时该位对应的功能

  • ICxx 则用于说明通道配置为输入时 该位对应的功能

因此,必须注意同一个位在输入阶段和输出阶段具有不同的含义。

pYYBAGDKIqqAaLK0AABGDNkRr5A165.png

这里仅先介绍输出模式下的功能:

  • 位 15 OC2CE:输出比较 2 清零使能 (Output compare 3 clear enable)

  • 位 14:12 OC2M[2:0]:输出比较 2 模式 (Output compare 2 mode)

  • 位 11 OC2PE:输出比较 2 预装载使能 (Output compare 2 preload enable)

  • 位 10 OC2FE:输出比较 2 快速使能 (Output compare 2 fast enable)

  • 位 9:8 CC2S[1:0]:捕获/比较 2 选择 (Capture/Compare 2 selection) 参考下面的CC1S通道1

  • 位 7 OC1CE:输出比较 1 清零使能 (Output compare 3 clear enable)

    OC1CE:输出比较 1 清零使能 (Output Compare 1 Clear Enable)

    • 0:OC1Ref 不受 ETRF 输入影响

    • 1:ETRF 输入上检测到高电平时, OC1Ref 立即清零。

  • 位 6:4 OC1M:输出比较 1 模式 (Output compare 1 mode) 一共可配置位7种模式,这里仅介绍2种:

    • 110:PWM 模式 1––在递增计数模式下,只要 TIMx_CNTTIMx_CCR1,通道 1 便为无效状态 (OC1REF=0),否则为有效状态 (OC1REF=1)。

    • 111:PPWM 模式 2––在递增计数模式下,只要 TIMx_CNTTIMx_CCR1,通道 1 便为有效状态,否则为无效状态。

  • 位 3 OC1PE:输出比较 1 预装载使能 (Output compare 1 preload enable)

    • 0:禁止与 TIMx_CCR1 相关的预装载寄存器。可随时向 TIMx_CCR1 写入数据,写入后将立即使用新值。

    • 1:使能与 TIMx_CCR1 相关的预装载寄存器。可读/写访问预装载寄存器。TIMx_CCR1 预装载值在每次生成更新事件时都会装载到活动寄存器中。

  • 位 2 OC1FE:输出比较 1 快速使能 (Output compare 1 fast enable)

    此位用于加快触发输入事件对 CC 输出的影响(仅当通道配置为 PWM1 或 PWM2 模式时,OCFE 才会起作用)。

    • 0:即使触发开启,CC1 也将根据计数器和 CCR1 值正常工作。触发输入出现边沿时,激活CC1 输出的最短延迟时间为 5 个时钟周期。

    • 1:触发输入上出现有效边沿相当于 CC1 输出上的比较匹配。随后,无论比较结果如何,OC 都设置为比较电平。采样触发输入和激活 CC1 输出的延迟时间缩短为 3 个时钟周期。

  • 位 1:0 CC1S[1:0]:捕获/比较 1 选择 (Capture/Compare 1 selection)

  • 此位域定义通道方向(输入/输出)以及所使用的输入。

    • 00:CC1 通道配置为输出。

    • 01:CC1 通道配置为输入,IC1 映射到 TI1 上。

    • 10:CC1 通道配置为输入,IC1 映射到 TI2 上。

    • 11:CC1 通道配置为输入,IC1 映射到 TRC 上。此模式仅在通过 TS 位(TIMx_SMCR 寄存器)选择内部触发输入时有效

      注: 仅当通道关闭时(TIMx_CCER 中的 CC1E = 0),才可向 CC1S 位写入数据。

3.3 计数器CNT

计数器的功能很单一,就是计数:

poYBAGDKIqqASVXzAAAb0AxxF0M738.png

  • 位 15:0 CNT[15:0]:计数器值 (Counter value)

3.4 预分频器PSC

预分频器的功能也很单一,就是分频:

poYBAGDKIquAa46pAAAYPP6nlaM484.png

  • 位 15:0 PSC[15:0]:预分频器值 (Prescaler value)

    计数器时钟频率CK_CNT等于fCK_PSC / (PSC[15:0] + 1)。

    PSC 包含在每次发生更新事件时要装载到实际预分频器寄存器的值。

3.5 自动重装载寄存器ARR

自动重装载寄存器的功能也很单一,就是保存一个数,在计数满的时候,重新开始计数

pYYBAGDKIquABh3PAAAZKY6QixM406.png

  • 位 15:0 ARR[15:0]:自动重载值 (Auto-reload value)

    ARR 为要装载到实际自动重载寄存器的值。

    当自动重载值为空时,计数器不工作。

3.6 捕获/比较寄存器CCR

自动重装载寄存器的功能也很单一,也是保存一个数,用于与当前的CNT进行比较,注意 TIM2 和 TIM5是32位计数。

pYYBAGDKIqyANJiWAAA6O4jStSU137.png

以CCR1寄存器(一共有CCR1~CCR4这4个通道)为例:

  • 位31:16 CCR1[31:16]:捕获/比较 1 的高 16 位(对于 TIM2 和 TIM5)。

  • 位15:0 CCR1[15:0]:捕获/比较 1 的低 16 位 (Low Capture/Compare 1 value)

    • 如果通道 CC1 配置为输出: CCR1 是捕获/比较寄存器 1 的预装载值。 如果没有通过TIMx_CCMR寄存器中的OC1PE位来使能预装载功能,写入的数值会被直接传输至当前寄存器中。否则只在发生更新事件时生效(拷贝到实际起作用的捕获/ 比较寄存器1)。 实际捕获/比较寄存器中包含要与计数器TIMx_CNT进行比较并在 OC1 输出上发出信号的值。

    • 如果通道 CC1 配置为输入: CCR1 为上一个输入捕获 1 事件 (IC1) 发生时的计数器值。


4 代码实现与分析

上面介绍了定时器的基础知识与PWM的输出原理,下面就来实际看一下,如何编写对应的代码(以STM32F407为例)。

4.1 定时器初始化

定时器的初始化,因为需要用到对应的引脚输出PWM,因此要先初始化GPIO引脚,然后,还要初始化定时器的时基(计数的时钟)以及输出通道(用于配置PWM的输出模式)。

4.1.1 复用引脚初始化

这里用到的是定时器3,根据STM32F407的数据手册“3 Pinouts and pin description”中的“Table 9. Alternate function mapping”复用引脚说明表,可以看到定时器3通道1对应的引脚位A6:

poYBAGDKIq2AKo5FAAD7x9uese0939.png

因此程序中对A6引脚可以这样配置,注意一定要配置引脚的复用功能:


GPIO_InitTypeDef GPIO_InitStructure; /*引脚配置 结构体*/


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟 

GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); /*GPIOA6复用为定时器3*/


/*复用引脚配置*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;      //GPIOA6

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;    //上拉

GPIO_Init(GPIOA,&GPIO_InitStructure);        //初始化PA6


4.1.2 时基初始化

时基初始化,主要是配置定时器的计数频率(psc)和自动重装置值(每次计数的周期,arr),比如

TIM3_PWM_Init(500-1,84-1);


(关于psc与arr的知识点,可以再回顾一下上面1.3节的知识)


这里将arr的值设置为500,即计数器每计够500个数就会重新从0开始计数,这个500再乘以计数器计数的周期,就是PWM真正的周期,那计数器计数的频率是多少呢(频率的倒数为周期)?


这里将psc的值设置为84-1,即TIM3的输入频率为84MHz再将频率降低1/84,即使用1MHz的频率计数(1s能计1,000,000个数,也即1us计1个数),那么PWM的真正周期就是

500*1us=500us(0.5ms)

,通过改变占空比的值(ccr),就可以调节PWM的输出占空比。

poYBAGDKIq6AZfPZAACDx5LWRLA671.png

时基初始化配置如下:


TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /*时基 结构体*/


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //TIM3时钟使能  


/*时基初始化*/

TIM_TimeBaseStructure.TIM_Period=arr;           /*ARR 自动重装载值(周期),例如500*/

TIM_TimeBaseStructure.TIM_Prescaler=psc;         /*PSC 定时器分频,例如84*/

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   /*时钟分割*/

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /*向上计数模式*/

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);      /*初始化定时器3*/

最后一句的时基初始化,起始就是对定时的寄存器进行配置,该函数的内部实现如下:


void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

{

 uint16_t tmpcr1 = 0;

 tmpcr1 = TIMx->CR1; 


 if((TIMx == TIM1) || (TIMx == TIM8)|| /*高级定时器TIM和TIM8*/

   (TIMx == TIM2) || (TIMx == TIM3)||(TIMx == TIM4) || (TIMx == TIM5)) /*通用定时器中的TIM2~TIM5*/

 {

  /* 设置为计数器模式 */

  tmpcr1 &= (uint16_t)(~(TIM_CR1_DIR | TIM_CR1_CMS));

  tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;

 }

 

 if((TIMx != TIM6) && (TIMx != TIM7)) /*基本定时器TIM6和TIM7无此功能*/

 {

  /* 设置时钟分频 */

  tmpcr1 &= (uint16_t)(~TIM_CR1_CKD);

  tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;

 }


 /* 配置CR1寄存器 */

 TIMx->CR1 = tmpcr1;


 /* 配置ARR寄存器,设置自动重转载值 */

 TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;

 

 /* 配置PSC寄存器,设置预分频值 */

 TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;

  

 if ((TIMx == TIM1) || (TIMx == TIM8)) /*高级定时器TIM和TIM8*/

 {  /* 配置RCR寄存器,设置重复计数值 */

   TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;

 }


 /* 生成一个更新事件来立即重新加载预分频器和重复计数器(仅针对高级定时器TIM1和TIM8)值 */

 TIMx->EGR = TIM_PSCReloadMode_Immediate;     

}


4.1.3 输出通道初始化

输出通道初始化,主要是配置输出的一些参数,这里主要关注TIM_OCMode(模式)与TIM_OCPolarity(极性),这两个参数是配合使用的:


PWM模式1


向上计数时,一旦

TIMx_CNT

时通道1为有效电平,否则为无效电平;


向下计数时,一旦

TIMx_CNT>TIMx_CCR1

时通道1为无效电平,否则为有效电平。


PWM模式2


向上计数时,一旦

TIMx_CNT

时通道1为无效电平,否则为有效电平;


向下计数时,一旦

TIMx_CNT>TIMx_CCR1

时通道1为有效电平,否则为无效电平。


这里的有效电平又是什么意思呢?怎么算有效电平?它就是通过极性来配置的:


输出High模式:有效电平为高电平


输出Low模式:有效电平为低电平


对比着再来看这张图:


当CNT的计数值小于CCR时,即t1这个时间段,输出有效电平(TIM_OCMode_PWM1模式),而有效电平是高电平(极性为TIM_OCPolarity_High),所以PWM的IO逻辑在t1这个时间段输出了高电平。


poYBAGDKIqmAen9xAADWlMbxy2g581.png

输出通道的配置如下:


TIM_OCInitTypeDef TIM_OCInitStructure; /*输出通道 结构体*/


/*输出通道初始化,初始化TIM3 Channel1 PWM模式*/ 

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;       /*选择定时器模式:TIM脉冲宽度调制模式1*/

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   /*输出极性:TIM输出比较极性高*/

TIM_OC1Init(TIM3, &TIM_OCInitStructure);            //根据指定的参数初始化外设TIM3 OC1


TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); /*使能TIM3在CCR1上的预装载寄存器*/

TIM_ARRPreloadConfig(TIM3,ENABLE);/*ARPE使能:使能控制寄存器CR的第8位:ARPR, Auto-reload preload enable*/

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

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

推荐阅读最新更新时间:2024-11-13 17:23

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