STM32单片机对正交编码器的驱动
- 格式:doc
- 大小:41.50 KB
- 文档页数:9
STM32 16位定时器对正交编码器计数的方法(附检测输入脉冲的方法)发布时间:2009-10-04 14:29:11今天决定在END开博,之前没有工作记录的习惯,从今天起在这里记录下自己工作时的点滴经验,以供日后参考以及与网络朋友交流。
第一篇文章先简要描述下STM32 定时器对正交编码器进行计数控制的方法。
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。
通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:void Encoder_Configration(void){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;//PC6 A相PC7 B相GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);/* Enable the TIM3 Update Interrupt *//*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRI ORITY;NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);*//* Timer configuration in Encoder mode */TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescalingTIM_TimeBaseStructure.TIM_Period = 10000;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;TIM_ICInit(TIM8, &TIM_ICInitStructure);// Clear all pending interruptsTIM_ClearFlag(TIM8, TIM_FLAG_Update);TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);//Reset counterTIM2->CNT = 0;TIM_Cmd(TIM8, ENABLE);}n_Counter = TIM_GetCounter(TIM8);Diled_Disp_Num((float)n_Counter);另外一个值得注意的问题是,STM32 的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。
STM32 16位定时器对正交编码器计数的方法(附检测输入脉冲的方法)发布时间:2009-10-04 14:29:11今天决定在END开博,之前没有工作记录的习惯,从今天起在这里记录下自己工作时的点滴经验,以供日后参考以及与网络朋友交流。
第一篇文章先简要描述下STM32 定时器对正交编码器进行计数控制的方法。
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。
通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:void Encoder_Configration(void){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;//PC6 A相PC7 B相GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);/* Enable the TIM3 Update Interrupt *//*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRI ORITY;NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);*//* Timer configuration in Encoder mode */TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescalingTIM_TimeBaseStructure.TIM_Period = 10000;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;TIM_ICInit(TIM8, &TIM_ICInitStructure);// Clear all pending interruptsTIM_ClearFlag(TIM8, TIM_FLAG_Update);TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);//Reset counterTIM2->CNT = 0;TIM_Cmd(TIM8, ENABLE);}n_Counter = TIM_GetCounter(TIM8);Diled_Disp_Num((float)n_Counter);另外一个值得注意的问题是,STM32 的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。
ec11stm32例程EC11STM32是一种旋转编码器,常用于嵌入式系统中,可以用来获取旋转方向和计算旋转角度。
在STM32开发板上使用EC11STM32,需要进行相应的配置和编程。
本文将介绍EC11STM32的原理、使用方法以及编程实例。
EC11STM32工作原理:EC11STM32包含一个旋转编码器和一个按钮开关。
旋转编码器由两个光电传感器、一个LED和一个编码盘组成。
编码盘上有很多小刻度,每当旋转编码器旋转一格,编码盘上的刻度就会遮挡或透过光电传感器,从而产生一个脉冲信号。
根据脉冲信号的变化,我们可以判断旋转的方向和计算旋转的角度。
EC11STM32的使用方法:在STM32开发板上使用EC11STM32,首先需要将EC11STM32连接到正确的GPIO引脚上。
然后,我们可以通过读取GPIO引脚的状态来获取旋转和按下按钮的信息。
对于旋转编码器,我们可以使用两个引脚来获取旋转方向和计数。
对于按钮开关,我们可以使用一个引脚来获取按下和释放的状态。
编程实例:下面是一个使用EC11STM32的简单编程实例,用于获取旋转方向和计算旋转角度:```c#include "stm32f10x.h"#define CLK_GPIO GPIOA#define DT_GPIO GPIOB#define BTN_GPIO GPIOC#define CLK_PIN GPIO_Pin_0#define DT_PIN GPIO_Pin_1#define BTN_PIN GPIO_Pin_13int main(void){GPIO_InitTypeDef GPIO_InitStructure;//初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);//配置CLK引脚为输入GPIO_InitStructure.GPIO_Pin = CLK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(CLK_GPIO, &GPIO_InitStructure);//配置DT引脚为输入GPIO_InitStructure.GPIO_Pin = DT_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DT_GPIO, &GPIO_InitStructure);//配置BTN引脚为输入GPIO_InitStructure.GPIO_Pin = BTN_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BTN_GPIO, &GPIO_InitStructure);int count = 0;int last_state = 0;int curr_state = 0;while (1){//读取CLK和DT引脚的状态last_state = curr_state;curr_state = GPIO_ReadInputDataBit(CLK_GPIO, CLK_PIN) << 1 | GPIO_ReadInputDataBit(DT_GPIO, DT_PIN);if (last_state != curr_state){//根据旋转方向增加或减少计数if ((last_state == 0b00 && curr_state == 0b01) || (last_state == 0b11 && curr_state == 0b10))count++;else if ((last_state == 0b01 && curr_state == 0b00) || (last_state == 0b10 && curr_state == 0b11))count--;//打印计数值printf("Count: %d\n", count);}//检测按钮是否按下if (GPIO_ReadInputDataBit(BTN_GPIO, BTN_PIN) == 0){//按钮按下时执行的操作printf("Button pressed\n");}}}```通过上述代码,我们可以实现读取EC11STM32的旋转和按钮信息,并进行相应的操作。
stm32编码器工作原理
STM32编码器的工作原理以下几个方面来进行讲解:
1. 编码器介绍:编码器是一种测量旋转运动的装置,能够将旋转角度转换为电信号输出。
2. 工作原理:STM32编码器工作原理基于两个光电传感器和
一个光栅带的相互作用。
光栅带上有一定数量的黑白条纹,两个光电传感器分别测量这些条纹的变化。
3. 接口模式:STM32编码器可以通过两种接口模式进行工作,分别是增量式和绝对式。
增量式编码器输出的是脉冲信号,而绝对式编码器输出的是相对位置数据。
4. 编码方式:STM32编码器可以通过两种编码方式进行工作,分别是光电和磁电编码。
光电编码器利用光电传感器对光栅带上的黑白条纹进行测量,而磁电编码器则利用磁场对磁栅带进行测量。
5. 编码器的应用:STM32编码器广泛应用于机器人、航空航天、汽车零部件和工控设备等领域,用于测量旋转运动的角度和速度。
总结:STM32编码器通过光电或磁电传感器对光栅带或磁栅
带上的黑白条纹进行测量,将旋转运动转换为电信号输出,并通过增量或绝对方式输出相对位置数据或脉冲信号。
它具有精
度高、响应速度快、可靠性强等优点,在许多领域中都有广泛的应用。
stm32电机驱动模块原理
stm32电机驱动模块原理
引言
•介绍stm32电机驱动模块的背景和意义
STM32电机驱动模块概述
•简要描述stm32电机驱动模块的功能
STM32单片机
•介绍STM32单片机的基本特点和应用场景
电机驱动方式
•列举电机驱动的常见方式,如直流电机驱动、步进电机驱动等stm32电机驱动模块的原理
•介绍stm32电机驱动模块的工作原理及其优势
•解释STM32单片机如何进行电机控制
–输入电机参数和控制指令
–简述编码器的使用及其对电机控制的重要性
–通过PWM信号控制电机速度和方向
stm32电机驱动模块的架构
•分析stm32电机驱动模块的主要组成部分
–MCU单元:负责接收和处理来自主控的指令
–电机驱动芯片:负责将MCU的PWM信号转化为合适的电流输出到电机
–电源模块:提供适量的电流和电压以供电机正常工作
–通讯接口:与外部主控设备进行数据交互
stm32电机驱动模块的使用
•介绍如何使用stm32电机驱动模块
•给出示例代码以帮助读者快速上手
stm32电机驱动模块的应用领域
•讨论stm32电机驱动模块在各个领域中的应用案例
总结
•对stm32电机驱动模块进行总结
•强调stm32电机驱动模块的重要性和前景
通过以上标题和副标题的方式,可以清晰地展示出对stm32电机驱动模块原理的解释和介绍。
这样的文章结构将有助于读者更好地理解和掌握相关内容。
有感FOC算法学习与实现总结⽂章⽬录基于STM32的有感FOC算法学习与实现总结1 前⾔Field Oriented Control磁场定向控制 (FOC),FOC是有效换向的公认⽅法。
FOC的核⼼是估计转⼦电场的⽅向。
⼀旦估计了转⼦的电⾓度,就将电动机的三相换相,以使定⼦磁场垂直于转⼦磁场。
本⽂参考了TI,microchip的相关⽂档,基于STM32F103系列单⽚机实现了带编码器的FOC算法,实现了对通⽤伺服电机(表贴式PMSM)的控制。
2 FOC算法架构FOC算法的整体架构如下图所⽰,采⽤了双闭环的控制系统,包括速度环和电流环,也叫转矩环,⽽传统的伺服驱动器还需要位置环,图中并未给出,这个后⾯另外描述,反馈部分采⽤双电阻采样,和增量编码器。
所以,从上图可以了解到,实现FOC算法总共需要以下⼏个部分;坐标变换,由于PMSM是⾮线性的复杂系统,为了实现控制上的解耦,需要进⾏坐标变换;Clark变换;Park变换;SVPWM模块;反馈量采集部分相电流采集编码器信号采集闭环控制部分可以分为三个环节;当然,根据需求,双闭环也⽐较常见;位置环速度环电流环下⾯会对每个环节的关键部分做⼀下介绍,具体的实现与细节由于篇幅有限会另外开篇幅做介绍。
3 坐标变换OABC OABC三相坐标到静⽌坐标系αβαβ坐标系可以分为恒幅值变换和恒功率变换,两者的主要区别就是变换系数不同,下⽂统⼀使⽤恒幅值变换。
3.1 Clark变换三相电流ABC分别为i A iA,i B iB,i C iC,根据基尔霍夫电流定律满⾜以下公式:i A+i B+i C=0iA+iB+iC=0静⽌坐标系αβαβ,αα轴的电流分量为iαiα,iβiβ,则Clark变换满⾜以下公式:iα=i A iβ=1√3∗iA+2√3∗iB iα=iA iβ=31∗iA+32∗iB3.2 Park变换Park变换的本质是静⽌坐标系αβαβ乘以⼀个旋转矩阵,从⽽得到dq dq坐标系,其中;d d 轴⼜叫直轴,⽅向与转⼦磁链⽅向重合;q q 轴⼜叫交轴,⽅向与转⼦磁链⽅向垂直;所以,帕克变换⼜叫交直变换,由静⽌坐标系αβαβ上的交流量最终变换到dq dq坐标系上的直流量;Park变换满⾜以下公式;i d=iα∗cosθ+iβ∗cosθi q=−iα∗cosθ+iβ∗cosθid=iα∗cosθ+iβ∗cosθiq=−iα∗cosθ+iβ∗cosθ3.3 Park反变换Park⼜叫直交变换,满⾜以下公式:iα=i d∗cosθ−i q∗sinθiβ=i d∗cosθ+i q∗cosθiα=id∗cosθ−iq∗sinθiβ=id∗cosθ+iq∗cosθ4 SVPWM实际的马鞍波如下图所⽰;5 反馈部分反馈部分需要采集相电流,电⾓度和速度,如下图所⽰;红⾊曲线表⽰i A iA;黄⾊曲线表⽰i B iB;蓝⾊曲线表⽰电⾓度θeθe;图中黄⾊箭头所指的点,可以看到满⾜以下条件:θe=0i A=0θe=0iA=05.1 相电流相电流采样通常有三种⽅案;单电阻采样;双电阻采样;三电阻采样;5.2 电⾓度和转速电⾓度的测量需要通过对编码器进⾏正交解码,STM32的TIM定时器⾃带编码器接⼝,可以很轻松实现对正交编码器的正交编码;6 闭环控制6.1 电流环最终给出电流闭环的结构,如下图所⽰;红⾊曲线表⽰iαiα黄⾊曲线表⽰iβiβ粉⾊曲线表⽰i q iq蓝⾊曲线表⽰i d id由于使⽤的表贴式PMSM,满⾜以下条件:L d=L q=L s Ld=Lq=Ls所以,d d轴和q q轴可以共⽤同⼀套PI参数,可以通过经验试凑法进⾏参数整定,或者可以通过测量电机参数,计算PI参数的⼤致范围,然后再进⾏细调。
STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。
通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。
下面是我调试OK的代码:void Encoder_Configration(void){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;//PC6 A相PC7 B相GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Prescaler =0x0; // No prescalingTIM_TimeBaseStructure.TIM_Period =10000;TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(TIM8,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter =6;//ICx_FILTER;TIM_ICInit(TIM8,&TIM_ICInitStructure);// Clear all pending interruptsTIM_ClearFlag(TIM8, TIM_FLAG_Update);TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);//Reset counterTIM2->CNT = 0;TIM_Cmd(TIM8, ENABLE);}n_Counter = TIM_GetCounter(TIM8);Diled_Disp_Num((float)n_Counter);另外一个值得注意的问题是,STM32的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。
编码器速度和⽅向检测,371电机⽅向与速度检测,stm32编码器接⼝模式编码器是什么玩意呢,它可是⼀个好玩的东西,做⼩车测速必不可少的玩意,下⾯,我将从编码器的原理讲起,⼀直到⽤stm32的编码器接⼝模式,测出电机转速与⽅向。
1.编码器图1 编码器⽰意图图1为编码器的⽰意图,中间是⼀个带光栅的码盘,光通过光栅,接收管接收到⾼电平,没通过,接收到低电平。
电机旋转⼀圈,码盘上有多少光栅,接受管就会接收多少个⾼电平。
371电机中的码盘就是这样的,他是334线码盘,具有较⾼的测速精度,也就是电机转⼀圈输出334个脉冲,芯⽚上已集成了脉冲整形触发电路,输出的是矩形波,直接接单⽚机IO就OK。
增量式旋转编码器通过内部两个光敏接受管转化其⾓度码盘的时序和相位关系,得到其⾓度码盘⾓度位移量增加(正⽅向)或减少(负⽅向)。
下图为编码器的原理图:图2 增量式旋转编码器A,B两点对应两个光敏接受管,A,B两点间距为 S2 ,码盘的光栅间距分别为S0和S1。
S0+S1的距离是S2的四倍。
这样保证了A,B波形相位相差90度。
旋转的反向不同,锯齿波A,B先到达⾼电平的顺序就会不同,如上图左侧所⽰,顺序的不同,就可以得到旋转的⽅向。
2.stm32编码器接⼝模式(寄存器)stm32的编码器接⼝模式在STM32中⽂参考⼿册中有详细的说明,在⼿册273页,14.3.12节。
程序是完全按照下图⽅式,设置寄存器的。
请到本⽂尾下载STM32中⽂参考⼿册图3从图3中可以看出,TI1波形先于TI2波形90°时,每遇到⼀个边沿变化是,计数器加1(可以通过寄存器设置加减),可以看出⼀个光栅,被计数了4次。
TI1波形后于TI2波形90°时,每遇到⼀次边沿变化,计数器减1。
1.//TIM2_Encoder_Init,Tim2_CH1(PA0);Tim2_CH2(PA1)2.//arr:⾃动重装值 0XFFFF3.//psc:时钟预分频数,不分频4.void TIM2_Encoder_Init(u16 arr,u16 psc)5.{6. RCC->APB1ENR|=1<<0; //TIM2时钟使能7.RCC->APB2ENR|=1<<2; //使能PORTA时钟8.9. GPIOA->CRL&=0XFFFFFF00; //PA0、PA1 清除之前设置10. GPIOA->CRL|=0X00000044; //PA0、PA1 浮空输⼊11.12. TIM2->ARR=arr; //设定计数器⾃动重装值13. TIM2->PSC=psc; //预分频器14.15.TIM2->CCMR1 |= 1<<0; //输⼊模式,IC1FP1映射到TI1上16.TIM2->CCMR1 |= 1<<8; //输⼊模式,IC2FP2映射到TI2上17.TIM2->CCER |= 0<<1; //IC1不反向18.TIM2->CCER |= 0<<5; //IC2不反向19.TIM2->SMCR |= 3<<0; //所⽤输⼊均在上升沿或下降沿有效20.TIM2->CR1 |= 1<<0; //使能计数器21.}复制代码3 硬件⽤到的模块有STM32核⼼板、L298电机驱动、371带编码器电机(1:34)。
基于STM32单片机的电机驱动设计宋玉宏;周定艺;詹金远;黄创业【摘要】介绍基于单片机控制直流电机驱动的设计方案.由单片机产生的转速、转向和制动的控制信号,经由逻辑电路进行运算对应于电机的特定工作状态,运算结果作为电机驱动电路H桥四个开关管的控制信号,从而实现直流电机的调速、正反转或停止等控制.利用光电传感器实时检测直流电机的转速,按照预先设定的参数调节速度,形成闭环控制.此设计方案运用到智能地面清洁机器人进行验证.完成并经测试后,样机可实现自动识别工作环境,自动清扫纸屑和灰尘等功能,达到智能清扫机器人设计要求.【期刊名称】《顺德职业技术学院学报》【年(卷),期】2018(016)002【总页数】4页(P6-9)【关键词】单片机;电机驱动;H桥;扫地机器人【作者】宋玉宏;周定艺;詹金远;黄创业【作者单位】顺德职业技术学院电子与信息工程学院,广东佛山 528333;顺德职业技术学院电子与信息工程学院,广东佛山 528333;顺德职业技术学院电子与信息工程学院,广东佛山 528333;顺德职业技术学院电子与信息工程学院,广东佛山528333【正文语种】中文【中图分类】TP249直流电机具有运转平稳、噪音低等优点,广泛用于电动类产品中。
电机的起停、转向及转速等控制策略是电机驱动的关键问题。
传统的电机驱动控制采用模拟方式,模拟控制电路复杂,精确性不高,功能扩展性受限,使得基于单片机的数字控制成为一种趋势。
本文研究以H桥电机驱动电路为工作电路,单片机把电机的起停、转向和转速指令发给逻辑控制电路,产生合理的信号作为H桥的四个控制端信号,防止H桥共态导通,保证电机的正常驱动。
驱动模块的控制电路主要由单片机、逻辑电路、放大电路、H桥驱动电路、光电编码测速以及电机六大部分构成,其总体设计方框图如图 1所示[1]。
单片机发出的主要控制信号有电机转向控制信号dir、电机转速控制信号pwm、电机制动信号ret。
这三路信号对电机动作的控制存在特定的逻辑关系,故由逻辑电路实现逻辑运算得到电机驱动的控制信号。