步进电机基本运动

1.思路: 用定时器替代mstimer2库,mstimer2底层实现是延时函数控制,delay函数占用CPU资源,使得CPU在delay函数工作时无法处理其他任务,二是delay函数延时并不精准导致步进电机运转不平稳,发热。
采用定时器中断控制高低电平的转换发出频率可变的方波可以解决上述问题,中断的使用可以让CPU处理其他任务,二是方波频率可调,时间精准。
arduino定时器:Timer0和timer2是8位定时器,可以存储最大计数器值255。Timer1是一个16位定时器,可以存储最大计数器值65535。我采用timer2驱动电机。

 TIMSK2 &= ~(1<<TOIE2);关闭中断TCCR2A &= ~((1<<WGM21) | (1<<WGM20));   //模式选择,正常模式TCCR2B &= ~(1<<WGM22);ASSR &= ~(1<<AS2);     //禁止异步中断触发TIMSK2 &= ~(1<<OCIE2A);     //中断允许标志位TCCR2B |= ( (1<<CS21) );                //分频控制--8分频TCCR2B &= ~( (1<<CS22)| (1<<CS20) );//tcnt2 = 256 - (int)((float)F_CPU * 0.00005 / 8);   //F_CPU = 16000000  TCNT2 = tcnt2;     //赋初值,从tcnt2一直往上加,一直到255,发生一次中断。TIMSK2 |= (1<<TOIE2);  //溢出中断允许标志位 打开中断ISR(TIMER2_OVF_vect){ //中断函数TCNT2 = tcnt2;  digitalWrite(STEP_PIN, digitalRead(STEP_PIN) ^ 1);}

步进电机正反转

1.思路:上面实现了步进电机的基本运动,方向控制只需要控制dir引脚的高低电平即可实现。通过按下按键即外部中断的方式控制电机正反转。
2.代码:

void set_key_deal(){static int flag_set = 0;//设置静态变量Serial.println("SET KEY");if(++flag_set >= 3) flag_set = 0;if(flag_set == 0){ digitalWrite(EN_PIN, LOW);   digitalWrite(DIR_PIN, HIGH);   Serial.println("正转"); }else if(flag_set == 1){digitalWrite(EN_PIN, LOW);   digitalWrite(DIR_PIN, LOW);    Serial.println("反转");}else if(flag_set == 2){digitalWrite(EN_PIN, HIGH);   digitalWrite(DIR_PIN, HIGH); Serial.println("停转");}
}attachPinChangeInterrupt( SET_PIN, set_key_deal, RISING );

编码器信息读取

1.思路:AS5600模块有三种模式检测步进电机一圈的实际角度,但是受uno的模拟输入(10位精度)精度影响不采用模拟输入模式,采用精度较高的i2c输入方式(12位精度)。基本原理为检测编码器的地址,再读取对应寄存器的值再转换为电机转动的角度值。
2.代码:word value = AS5600_IIC_Read_OneByte((0x36<<1),0x0e);
value <<= 8;
value |= AS5600_IIC_Read_OneByte((0x36<<1),0x0f);

速度检测

1.思路:我采用timer1中断计时,把当前角度值减去上次角度值的差值除以一次中断时间得到速度
2.出现问题:uno不能同时开启两个中断,故开启一次定时器1中断,立即关闭并设置一个标志放在loop里面处理相关函数,处理完后开启中断,这样导致每次采集到的millis函数时间不是严格的20ms,会出现一定误差,比如电机实际转速180r/m,但检测到的值在175-185r/m跳动。
3.代码:

  TCCR1A = 0;//将整个TCCR1A寄存器设置为0TCCR1B = 0;//将整个TCCR1B寄存器设置为0TCNT1  = 0;//将计数器值初始化为0//20ms进入中断OCR1A = 1249;//199;// = (16*10^6)/(10*1024) - 1 (must be <65536)TCCR1B |= (1 << WGM12 );//打开CTC模式TCCR1B |= (1 << CS12);//设置CS11位为1(256倍预分频)TIMSK1 |= (1 << OCIE1A);ISR(TIMER1_COMPA_vect){flag_timer1 = 1;TIMSK1 &= ~(1 << OCIE1A);
}double returnSpeed( float a,float b,float c,float d)
{if(digitalRead(DIR_PIN) == 1)
{if(abs(b - a) > 2000){b += 4095;}float val = (float)((b - a)/(d - c))*(60000/4096.0); //Serial.println(String(a)+" "+String(b)+" "+String(c)+" "+String(d)+" ");return val;}else if(digitalRead(DIR_PIN) == 0){if(abs(a - b) > 2000){a += 4095;}float val = (float)((a - b)/(d - c))*(60000/4096.0); //Serial.println(String(a)+" "+String(b)+" "+String(c)+" "+String(d)+" ");return val;}}if(flag_timer1 == 1){this_millis = millis();float this_encoder = (4090*abs(overFlowCounter))/(3200*2) + value;rpm = returnSpeed(last_encoder,this_encoder,last_millis,this_millis);Serial.println(rpm);last_millis = this_millis;last_encoder = this_encoder;flag_timer1 = 0;TIMSK1 |= (1 << OCIE1A);}

步进电机正反转驱动、AS5600编码器信息读取及速度检测相关推荐

  1. 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速-萌新入门

    ** 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速 ** 分享一个萌新入门小工程 一.原件连接: 第一种直接用51开发板 第二种用最小单元加unl2003驱动 二.开发板电路 ...

  2. K_A07_003 基于 STM32等单片机驱动DRV8825模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 SETP时序 对应程序: 细分说明 程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+DRV8825模块 1. ...

  3. K_A07_001 基于 STM32等单片机驱动A4988模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 SETP时序 对应程序: 细分说明 程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+A4988模块 1.2. ...

  4. K_A07_005 基于 STM32等单片机驱动 DRV8833 模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 步进电机驱动时序 对应程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+DRV8833模块 1.2.STM3 ...

  5. K_A07_002 基于 STM32等单片机驱动ULN2003模块按键控制步进电机正反转

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 步进电机驱动时序 反向输出 对应程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+ULN2003模块 1.2 ...

  6. C语言步进电机自动加减速,步进电机正反转和加速减速c源程序

    这是一个群里朋友发给我的步进电机实现正转反转和加速减速的单片机c语言源程序,这里给大家共享下,有需要的朋友直接复制到keil里编译就可以了,程序已测试成功. /******************** ...

  7. proe输入数字时成双出现_Proe/Creo步进电机正反转仿真详解

    本教程对步进电机正反转进行仿真,设顺时针为正转,逆时针为反转,步进电机驱动转盘,转盘正转一圈,停止,反转半圈,停止,反转半圈. 1. 新建组件,添加电机57HS22-a,在默认位置装配,如下图: 2. ...

  8. 89c52单片机控制两个步进电机正反转加减速(程序+仿真)

    89c52单片机控制两个步进电机正反转加减速(程序+仿真) 先上图: 源代码: /*********************************************************** ...

  9. 控制步进电机正反转的实际应用程序

    /*这是一个控制步进电机正反转的实际应用程序*/ /*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/ /*p13口线用做步进电机的方向控制.p15,p16,p17是光耦开关量输入*/ ...

最新文章

  1. 程序化广告(1):程序化广告概述
  2. 最强大的多线程解决方案!!
  3. 华为云计算基础-华为云计算套件
  4. 20个html标签及其作用,请写出至少20个html标签,并说说各个标签的功能或作用。...
  5. VS中一些提高编码效率的快捷键
  6. bzoj 3131 [Sdoi2013]淘金(数位dp)
  7. 深度学习(32)随机梯度下降十: 手写数字识别问题(层)
  8. 性能为MySQL 10倍!阿里云推出云原生数据仓库AnalyticDB基础版
  9. 嘿,来打游戏!中国电竞人才缺口达50万
  10. php单独输出每个单词,PHP:在特定短语/单词之后搜索文本文件并输出
  11. UVA-Parentheses Balance
  12. 《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 导读
  13. Activity保存状态saving activity state和onPause()
  14. .NET Reflector 反射下载
  15. matlab 工具箱 comsol 联,基于MATLAB与COMSOL联合仿真的电磁优化设计
  16. 【PPT模板】甄选100套时间轴精品
  17. 本周大新闻|传Cambria采用升级版XR2芯片,TGS增设VR虚拟展厅
  18. 身份证如何扫描成电子版?这个方法很好用
  19. 图像处理(九)-图片和数组的转换
  20. 360流量卫士android 9,360流量卫士

热门文章

  1. “小清新”风格的视觉表现
  2. 多模态--[GRCN]Graph-Refined Convolutional Network for Multimedia Recommendation with Implicit Feedback
  3. JavaScript之观察者模式
  4. 输入年月日,输出星期几
  5. JAVA项目开发点滴
  6. XML的方法–第1部分– XML不是字符串…
  7. 跳出forEach循环
  8. Emacs_238_company中使用C-j和C-k选择候选项
  9. 平面设计和网页设计的区别
  10. SocialBook为你揭秘为什么你的网红既不带货也不带量?