1 / 40

2012 年 05 月 04 日

机电控制工程. 步进电机控制实验. 2012 年 05 月 04 日. 步进电机基础. 1. 步进电机控制. 2. 步进电机基础. 步进电机 将 电脉冲信号 变换成相应的 角位移或者直线位移 的机电执行元件。 步进电机的位移量与输入脉冲严格成比例,不会引起误差积累。 转速 取决于脉冲信号的频率, 总位移量 取决于总的脉冲信号数, 转向 取决于绕组通电顺序。 应用 优点:简化系统,工作可靠,不需要位移传感器就可以达到较精确的 定位,获得较高的控制精度。 缺点:功率小,输出力矩小。.

vida
Télécharger la présentation

2012 年 05 月 04 日

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 机电控制工程 步进电机控制实验 2012年05月04日

  2. 步进电机基础 1 步进电机控制 2

  3. 步进电机基础 • 步进电机 • 将电脉冲信号变换成相应的角位移或者直线位移的机电执行元件。 • 步进电机的位移量与输入脉冲严格成比例,不会引起误差积累。 • 转速取决于脉冲信号的频率,总位移量取决于总的脉冲信号数,转向取决于绕组通电顺序。 • 应用 • 优点:简化系统,工作可靠,不需要位移传感器就可以达到较精确的 定位,获得较高的控制精度。 • 缺点:功率小,输出力矩小。

  4. SB接通,SA、SC、SD断开,磁极B和转子0、3对齐,其他产生错齿;SB接通,SA、SC、SD断开,磁极B和转子0、3对齐,其他产生错齿; SC接通,SB、SA、SD断开,磁极C和转子1、4对齐,其他产生错齿。 依次类推,A、B、C、D四相轮流供电,转子就会沿着A、B、C、D转动。 步进电机基础

  5. 步进电机基础 • 基本概念 • 步距 输入一个电脉冲时,转子转过的角度。 • 齿距 各相绕组轮流通电一次,转子就转过一个齿距。 • “单” 每次切换前后只有一相绕组通电。 • “双” 每次切换前后有两相绕组通电。 • “拍” 从一种通电状态换到另一种通电状态叫做一“拍”。 • 举例说明(三相步进电机) • 单相轮流(三相单三拍 ) A—B—C—A • 双相轮流(三相双三拍) AB—BC—CA—AB • 单双相轮流(三相单双六拍) A—AB—B—BC—C—CA—A • 单相轮流方式下,每次只有一相控制绕组通电吸引转子,容易使转子在平衡位置附近产生振荡,运行稳定性较差。另外,在切换时一相绕组断电而另一相控制绕组开始通电,容易造成失步。

  6. 步进电机基础 • 基本运算 • 相数: m • 状态系数: K(单三拍、双三拍时,K=1;单双六拍时,K=2) • 电脉冲频率:f (Hz) • 转子齿数: Z • 增大转子齿数Z、定子相数m或者运行拍数K,可以减小步距角,提高控制精度。

  7. 步进电机基础 • 实验中用到的步进电机:四相 a. 四相四拍 b. 四相双四拍 c.四相八拍 a.四相四拍 A->B->C->D b.四相双四拍 AB->BC->CD->DA c.四相八拍 A-> AB-> B->BC->C-> CD-> D-> DA

  8. 步进电机基础 24BYJ48A 电机旋转一周需要多少个脉冲? 360/5.625×64=64×64=4096

  9. 步进电机基础 1 步进电机控制 2

  10. 步进电机控制 • 采用AVR单片机作为主控单元,L298作为驱动芯片。控制框图如下: 转过的角度: 脉冲个数 转速: 频率 转向: 绕组通电顺序

  11. 步进电机控制 • 环形分配器的实现 • 采用软件方式: 四相八拍环形分配器数值表如下,在单片机程序中延时一段时间后按顺序轮转输出以下值以使其正转或反转。

  12. 步进电机驱动电路 引脚PB1、PB3、PB2、PB4分别控制步进电机的A、B、C、D四相。

  13. 脉冲的产生 引脚 PB1: A相 PB3: B相 PB2: C相 PB4: D相 • 定义8个宏 #define A() (PORTB = 0B00000010) #define B() (PORTB = 0B00001000) #define C() (PORTB = 0B00000100) #define D() (PORTB = 0B00010000) #define AB() (PORTB = 0B00001010) #define BC() (PORTB = 0B00001100) #define CD() (PORTB = 0B00010100) #define DA() (PORTB = 0B00010010)

  14. 1、四相四拍: A->B->C->D->A 2、四相双四拍:AB->BC->CD->DA->AB 3、四相八拍: A-> AB-> B->BC-> C-> CD-> D-> DA->A 控制拍子顺序倒置即让电机反转! 根据控制算法产生时序脉冲

  15. 四相八拍环形分配器程序 if(step_choice == EIGHTBEATS)//四相八拍 { if(dir_flag == FORWARD)//正转 { if(step == 0) A(); else if(step == 1) AB(); else if(step == 2) B(); else if(step == 3) BC(); else if(step == 4) C(); else if(step == 5) CD(); else if(step == 6) D(); else if(step == 7) DA(); } else if(dir_flag == BACKWARD)//反转 {…} step++; if(step == 8) step = 0; }

  16. 步进电机速度控制 • 速度控制 实际上就是控制系统发出脉冲的频率。系统可以用两种方法确定脉冲的频率: • 软件延时:通过调用延时子程序的方法实现的,它占用CPU时间。#include “delay.h” • 定时器:通过设置定时时间常数的方法来实现。

  17. 分频原理 8MHz 4MHz 从8MHz到50Hz需要多少分频? 8000,000/50=160000 定时器最多到1024分频,因此到最多的分频也不能达到50Hz的启动频率的目的。 定时器 ?

  18. 定时器原理 • 以定时器0为例 TCCR0:定时器控制寄存器

  19. 定时器原理 • 以定时器0为例 TCNT0:定时器寄存器(计数) 定时器0溢出中断: //interrupt [TIM0_OVF] void timer0_ovf_isr(void) 目的:定时器计满后再改变脉冲状态,就达到了分频的目的

  20. 定时器实现 1)11.059M / 1024 = 10799.8 2)10799.8/ 50 = 215.996= 0xD7 3)0xFF + 1 – 0xD7 = 0x29 4)TCNT0 = 0x29 //TIMER0 initialize - prescale:1024 // desired value: 50Hz // actual value: 50.232Hz (0.5%) void timer0_init(void) { TCCR0 = 0x00; //stop TCNT0 = 0x29; //set count TCCR0 = 0x05; //start timer } #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF void timer0_ovf_isr(void) { TCNT0 = 0x29; //reload counter value //添加步进电机核心代码 }

  21. 定时器实现 • 宏定义 • 通电方式 • 正反转 • 脉冲个数 • 每拍状态 • 全局变量 • 转向 • 通电方式 • 当前拍状态 • 当前脉冲个数 • Timer0溢出中断服务程序 • 按键(外部中断)改变电机转向

  22. 定时器实现 T0溢出中断 T0重装载初值 拍数+1,到8清零 N 没有达到总脉冲数? 脉冲数+1,到4096清零 Y T0关 是四相八拍? 结束 Y 是否正转? N Y 环形分配器分配正转脉冲 环形分配器分配反转脉冲

  23. 定时器实现 else if(dir_flag == BACKWARD){ if(step == 0) DA(); else if(step == 1) D(); else if(step == 2) CD(); else if(step == 3) C(); else if(step == 4) BC(); else if(step == 5) B(); else if(step == 6) AB(); else if(step == 7) A();}step++;if( step == 8) step = 0; } current_step++; if(current_step == TOTALSTEP) { TCCR0 = 0x00; //stop Timer } } if ( current_step <TOTALSTEP){ //四相八拍 if(step_choice ==EIGHTBEATS){ if(dir_flag == FORWARD) { if(step == 0) A(); else if(step == 1) AB(); else if(step == 2) B(); else if(step == 3) BC(); else if(step == 4) C(); else if(step == 5) CD(); else if(step == 6) D(); else if(step == 7) DA(); }

  24. 定时器实现 /***********GlobalValues************/char dir_flag = BACKWARD;char step_choice = EIGHTBEATS;char step = 0;int current_step = 0; /***********************************/ #pragma interrupt_handler int0_isr:iv_INT0void int0_isr(void){ //external interupt on INT0 dir_flag = FORWARD;}#pragma interrupt_handler int1_isr:iv_INT1void int1_isr(void){ //external interupt on INT1 dir_flag = FORWARD;} #define FOURBEATS 0 //四相四拍 #define DOUBLEFOURBEATS 1 //四相双四拍 #define EIGHTBEATS 2 //四相八拍 #define A() (PORTB = 0B00000010) #define B() (PORTB = 0B00001000) #define C() (PORTB = 0B00000100) #define D() (PORTB = 0B00010000) #define AB() (PORTB = 0B00001010) #define BC() (PORTB = 0B00001100) #define CD() (PORTB = 0B00010100) #define DA() (PORTB = 0B00010010) #define FORWARD 0 #define BACKWARD 1 #define TOTALSTEP 4096

  25. 开始 外部中断0 外部中断1 定时中断 初始化IO 显示数据1234 显示数据5678 重载定时 寄存器 初始化定时器 初始化AD 改变方向标志 改变方向标志 输出时间 序列 开中断 步数+1 采集AD 设定步数到 N 显示AD Y 停止 计数器 计算定时器初值 作业程序流程图

  26. 作业任务分解 • 中断触发+数码管显示 • AD采集+LED显示 • 融合中断+AD采集+数码管显示+电机运动

  27. 向导生成初始化程序

  28. 向导生成初始化程序

  29. 中断触发+数码管显示

  30. 选择 参考电压 设置分频方式 并启动ADC 通道 选择通道 开始AD转换 AD转换函数 N AD转换完成? Y AD值 计算AD值 输出AD值 AD采集 初始化AD • AD采集流程

  31. AD转换寄存器功能 ADMUX:多工选择寄存器

  32. AD转换寄存器功能 ADCSRA: ADC控制状态寄存器

  33. AD采集转换寄存器功能 ADCL、ADCH:ADC数据寄存器

  34. 选择 参考电压 设置分频方式 并启动ADC 通道 选择通道 开始AD转换 N AD转换完成? Y AD值 计算AD值 输出AD值 AD转换实现 #define ADC_Filter_Num 10 //定义滤波次数 //ADC initialize // Conversion time: 75uS void adc_init(void) { ADCSR = 0x00; //disable adc ADMUX = 0x00; //select adc input 0 ACSR = 0x80; ADCSR = 0x86; //64分频 }// Read the AD conversion resultunsigned int read_adc(unsigned char adc_input){unsigned int i; unsigned char k; ADMUX=adc_input; ADCSRA|=0x40;// Start the AD conversion// Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); k = ADCL; i = ADCH; i = (i<<8)+k; ADCSRA |= 0x10; return i;}

  35. 主函数 void main(void) { int AdcData = 0, temp; static int num = 0; static float sum = 0; init_devices();while(1) { temp = read_adc(7); if(num < ADC_Filter_Num) { sum += temp; num ++; } else {//滤波,求出电机频率 //延时,等待数码管稳定的显示 } }}

  36. 注意事项 • 中断服务程序与方向的关系 dir_flag : BACKWARD or FORWARD • AD采集与速度的关系 TCNT0 ~ 频率~adData • 步进电机范围是50~500Hz AD采集的数据范围adData是0~1023 所以二者的线性关系式是 f=50+(450.0/1023.0)*adData 数据类型 滤波 ? TCNT0=

  37. 步进电机控制要点 • 为了量化观测实际控制效果,用LED观看旋钮AD值比较方便。 • 方向: 环形分配方式 • 角位移: 脉冲个数 • 速度: 脉冲频率

  38. 作业要求 • 演示(二选一) • 通过电位计控制电机转速,按键控制转向,并在数码管上稳定的显示当前转速 • 通过上位机串口发送速度与方向指令给电机,并用数码管和LED灯显示转速和转向 • 文档 • 背景知识 • 单片机资源设置 • 程序流程图 • 调试过程 • 学习心得

  39. 作业要求 • 演示时间 • 2012年5月11日(周五)晚上7点B307 • 文档提交时间 • 2012年5月17日(周四)晚24点之前 • 文档命名方式 • 学号+姓名+第三次作业 • 实验箱归还时间 • 2012年5月18日(周五)24点之前 • 请爱惜设备!

  40. 谢谢大家

More Related