找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10730|回复: 5
打印 上一主题 下一主题
收起左侧

用Adruino写的电机测速与调速的程序

[复制链接]
跳转到指定楼层
楼主
ID:193567 发表于 2017-7-12 04:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是前一个礼拜的作品,Adruino IDE使用的是1.8.2版本,UNO板作为主控,电机使用的是最普遍的直流减速电机(带电刷),测速码盘是20格数的,驱动模块采用常见的L298N,测速模块使用槽型光电传感器,通过输出高低电平,来判断有无物体经过。(大佬莫笑)

全部资料下载地址:
spees_tset_control.zip (1.79 KB, 下载次数: 84)
control_motor_speed.zip (2.04 KB, 下载次数: 49)

部分程序预览:
  1. int k1 = 4; //启动
  2. int k2 = 5; //停止
  3. int k3 = 6; //加速
  4. int k4 = 7; //减速
  5. int keystate = 0;     //初值=0,按键状态标志位
  6. boolean ledstate = 0; //初值=0,记录led状态
  7. int ledpin = 11;  //按键指示灯
  8. int M1 = 12;       //电机引脚12
  9. int M2 = 13;      //电机引脚13
  10. int PWM_ENA = 3;  //pwm调速控制脚
  11. int motorState = 0; //电机状态
  12. float level=0.255;       //占空比++
  13. float rate=0;         //定义占空比的数值
  14. #define rateMax 255 //PWM最大值
  15. #define rateMix 0   //PWM最小值
  16. int zkb;
  17. void setup()
  18. {
  19.   // put your setup code here, to run once:
  20.   pinMode(k1, INPUT_PULLUP);  //设置为内部上拉电阻
  21.   pinMode(k2, INPUT_PULLUP);
  22.   pinMode(k3, INPUT_PULLUP);
  23.   pinMode(k4, INPUT_PULLUP);
  24.   pinMode(M1, OUTPUT);
  25.   pinMode(M2, OUTPUT);
  26.   //pinMode(PWM_ENA,OUTPUT);  
  27.   Serial.begin(9600);
  28.   
  29.   pinMode(ledpin, OUTPUT);
  30. //  int fff=3;    //fff=2:Frequency=980.392HZ
  31. //  TCCR2B=(TCCR2B&0xF8)|fff; //timer2控制Pin 11和Pin 3  

  32. //------Set PWM frequency for D9 & D10------
  33. //TCCR1B = TCCR1B & B11111000 | B00000001;   
  34. // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz

  35. //TCCR1B = TCCR1B & B11111000 | B00000010;   
  36. // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz

  37. //TCCR1B = TCCR1B & B11111000 | B00000011;   
  38. // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)

  39. //TCCR1B = TCCR1B & B11111000 | B00000100;   
  40. // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz

  41. //TCCR1B = TCCR1B & B11111000 | B00000101;   
  42. // set timer 1 divisor to  1024 for PWM frequency of 30.64 Hz
  43. }

  44. void keyscan()  //按键程序
  45. {
  46.   if (digitalRead(k1) == 0) //按键按下
  47.   {
  48.     delay(10);  //消抖
  49.     if (digitalRead(k1) == 0) //确认按键按下
  50.     {
  51.       keystate = 1; //按键1按下状态标志
  52.     }
  53.     while (!digitalRead(k1)); //松手检测
  54.   }

  55.    if (digitalRead(k2) == 0) //按键按下
  56.   {
  57.     delay(10);  //消抖
  58.     if (digitalRead(k2) == 0) //确认按键按下
  59.     {
  60.       keystate = 2;   //按键2按下状态标志
  61.     }
  62.     while (!digitalRead(k2)); //松手检测
  63.   }

  64.   if (digitalRead(k3) == 0) //按键按下
  65.   {
  66.     delay(10);  //消抖
  67.     if (digitalRead(k3) == 0) //确认按键按下
  68.     {
  69.       keystate = 3; //按键1按下状态标志
  70.     }
  71.     while (!digitalRead(k3)); //松手检测
  72.   }

  73.    if (digitalRead(k4) == 0) //按键按下
  74.   {
  75.     delay(10);  //消抖
  76.     if (digitalRead(k4) == 0) //确认按键按下
  77.     {
  78.       keystate = 4;   //按键2按下状态标志
  79.     }
  80.     while (!digitalRead(k4)); //松手检测
  81.   }
  82. }

  83. void on() //占空比50%
  84. {
  85.   digitalWrite(M1,HIGH);  //保持电机一个方向转动
  86.   digitalWrite(M2,LOW);  
  87.   analogWrite(PWM_ENA,rateMax/2);  //输入模拟值,控制占空比(速度)
  88. }

  89. void off()  
  90. {
  91.   analogWrite(PWM_ENA,LOW);  //输入模拟值,控制占空比(速度)
  92. }

  93. void loop()
  94. {
  95.   // put your main code here, to run repeatedly:   
  96.   keyscan();  //调用键值扫描程序
  97.   if(keystate==1)
  98.   {
  99.     keystate = 0; //恢复初值,以读取下一次键值
  100.     on();
  101.   }
  102.   if(keystate==2)
  103.   {
  104.     keystate = 0; //恢复初值,以读取下一次键值
  105.     off();
  106.   }

  107.   if (keystate == 3) //记录按键已被按下
  108.   {
  109.     keystate = 0; //恢复初值,以读取下一次键值   
  110.     rate+=level; //PWM占空比加速级别
  111.     zkb+=1;
  112.     Serial.print("The pwm=");
  113.     Serial.print(rate);  //实时显示占空比值
  114.     Serial.println("/255");
  115.    
  116.     Serial.print(zkb);
  117.     Serial.println("/1000");
  118.     if(rate>=rateMax) //如果到最大值
  119.     {
  120.       rate=rateMax;   //保持当前最大速度
  121.       Serial.print("The pwmMax=");
  122.       Serial.print(zkb);   //达到最大限值
  123.       Serial.println("/1000\n");
  124.     }      
  125.     if(zkb>=999)  zkb=999;
  126.     digitalWrite(M1,HIGH);//保持电机一个方向转动  
  127.     digitalWrite(M2,LOW);   
  128.     analogWrite(PWM_ENA,rate);  //输入模拟值控制占空比(速度)      
  129.   }
  130.   
  131.   if (keystate == 4) //记录按键已被按下
  132.   {
  133.     keystate = 0; //恢复初值,以读取下一次键值  
  134.     rate-=level; //PWM占空比加速级别
  135.     zkb-=1;
  136.     Serial.print("The pwm=");
  137.     Serial.print(rate);     //实时显示占空比值
  138.     Serial.println("/255");
  139.    
  140.     Serial.print(zkb);
  141.     Serial.println("/1000");
  142.     if(rate<=rateMix) //如果到最小值
  143.     {
  144.       rate=rateMix;   //保持当前最小速度     
  145.       Serial.print("The pwmMin=");
  146.       Serial.print(zkb);   //达到最小限值
  147.       Serial.println("/1000\n");
  148.     }
  149.     if(zkb<=1)  zkb=1;   
  150.     digitalWrite(M1,HIGH);  //保持电机一个方向转动
  151.     digitalWrite(M2,LOW);  
  152.     analogWrite(PWM_ENA,rate);  //输入模拟值,控制占空比(速度)  
  153.   }  
  154. }

  155. //void setPwmFrequency(int pin, int divisor)
  156. //{
  157. //  byte mode;
  158. //  if(pin == 5 || pin == 6 || pin == 9 || pin == 10)
  159. //  {
  160. //    switch(divisor)
  161. //    {
  162. //      case 1: mode = 0x01; break;
  163. //      case 8: mode = 0x02; break;
  164. //      case 64: mode = 0x03; break;
  165. //      case 256: mode = 0x04; break;
  166. //      case 1024: mode = 0x05; break;
  167. //      default: return;
  168. //    }
  169. //    if(pin == 5 || pin == 6)
  170. //    {
  171. //      TCCR0B = TCCR0B & 0b11111000 | mode;
  172. //    } else {
  173. //      TCCR1B = TCCR1B & 0b11111000 | mode;
  174. //    }
  175. //  }
  176. //  
  177. //  else if(pin == 3 || pin == 11)
  178. //  {   
  179. //    switch(divisor)
  180. //    {
  181. //      case 1: mode = 0x01; break;
  182. //      case 8: mode = 0x02; break;
  183. //      case 32: mode = 0x03; break;
  184. //      case 64: mode = 0x04; break;
  185. //      case 128: mode = 0x05; break;
  186. //      case 256: mode = 0x06; break;
  187. //      case 1024: mode = 0x7; break;
  188. //      default: return;
  189. //    }
  190. //    TCCR2B = TCCR2B & 0b11111000 | mode;
  191. //  }
  192. //}
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:193567 发表于 2017-7-12 04:04 | 只看该作者
等下次把一些图片和解释放上来,都快天亮了
回复

使用道具 举报

板凳
ID:258474 发表于 2018-7-11 17:52 | 只看该作者
流连涅槃 发表于 2017-7-12 04:04
等下次把一些图片和解释放上来,都快天亮了

速度显示用什么显示屏
回复

使用道具 举报

地板
ID:258474 发表于 2018-7-11 17:54 | 只看该作者
速度显示用什么显示屏
回复

使用道具 举报

5#
ID:258474 发表于 2018-7-11 17:55 | 只看该作者
速度显示用什么显示屏
回复

使用道具 举报

6#
ID:218324 发表于 2019-5-19 11:51 | 只看该作者
学习学习!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表