霍尔传感器测速代码_arduino直流电机调速

霍尔传感器测速代码_arduino直流电机调速标题本人目前是一个大一菜鸟,零基础学的编码器方面,希望我的经验对你有些帮助。分享一下霍尔编码器电机的使用与测速,我用的是25GA-310直流减速电机带霍尔传感器。先来看一下最基本的接线方法————-S1与S2连接单片机上的S(我这里用的2号和3号,是中断引脚);——G与V连接单片机上的G与V(对着接就行);——VM与GM接航模电池的正极与负极;测速…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

标题

本人目前是一个大一菜鸟,最近在学编码器方面的知识,希望我的经验对你有些帮助。
分享一下霍尔编码器电机的使用与测速,我用的是25GA-310直流减速电机。先来看一下最基本的
接线方法——-
在这里插入图片描述

测速原理

##测速原理
这里需要用到一些基本函数,大家可以去相关网站去找一下,重要的是定时器函数和中断函数
我用的这个电机脉冲数双相300个,单相150个。(电机的型号不同可能会不一样,如果店家那没有的话可以抠出来下面一部分程序测)
具体思路:首先使用定时器定时一个时间,我这里用的是50ms。编码器转一圈会发送脉冲,一个脉冲可以产生一个中断,在中断函数里令一个变量自加,每产生一个脉冲该变量就加1。所以该变量就是脉冲数。
通过50ms内产生得脉冲数就可以算出速度了(这里是角速度,如果要具体算速度的话乘以轮子半径即可)。用脉冲数/150( 这里用单相或者双相都一样,我用的单相得)即可得到在这50ms内电机转动得圈数。再乘以20就是一秒内转的圈数,再乘以60就是一分钟转的圈数 。 下面是代码
打开串口绘图器即可观察数据(打印函数一定要用 Serial.println()才可以显示哦)

#include <TimerOne.h>
float v;
volatile long counter_val0=0;
volatile long counter_val1=0;      //该变量用于存储编码器的值,所以用类型修饰符volatile;
int j=0;                           //定时器标志;

void setup()
{
  delay(2000);
  pinMode(2, INPUT);
  pinMode(3, INPUT);                    //设置为输入模式,并且2,3号引脚是中断口0,1;

  Serial.begin(115200);                //初始化波特率为115200
  attachInterrupt(0, counter0, RISING);//设置编码器A相位上升沿中断
  attachInterrupt(1, counter1, RISING);//设置编码器B相位上升沿中断
  Timer1.initialize(50000);            // 设置定时器中断时间,单位微秒 ,这里是50毫秒
  Timer1.attachInterrupt( timerIsr ); // 打开定时器中断
  interrupts();                      //打开外部中断
}
void loop()
{
  long lTemp = 0; //定义临时存储数据变量
  if(j==1)        //判断是否发生定时器中断,这里是50ms发生一次
   {
       j=0;       //清除标记
   }     
}
//外部中断处理函数
void counter0()
{
     counter_val0++;    //每一个中断加一
}
void counter1()
{
     counter_val1++;    //每一个中断加一
}
//定时器中断处理函数
void timerIsr()
{
   j=1;                           //定时时间达到标志     
   v=60*20*counter_val0/150.0;    //这里的单位是转每分钟:r/min
   Serial.println(v);    
   counter_val0=0;
   counter_val1=0;               //清空该时间段内的脉冲数
   return v;                
}

PID

如果有对PID算法感兴趣的我们可以讨论下,根据编码器测速写了一个控制电机速度的算法,但是参数我还没调出来。下面是源代码。如果有错误希望大佬们给我提醒一下

#include <TimerOne.h>
#define set_point 100
 float v;
long counter_val0=0;
long counter_val1=0;
int j=0;

void setup()
{ 
   
  delay(2000);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);       //启用电机A的三个管脚,全部设置为输出状态
  digitalWrite(9, LOW);       //松开电机A的制动
  digitalWrite(8, HIGH);      //设置方向为正向旋转
  Serial.begin(115200);//初始化波特率为115200
  attachInterrupt(0, counter0, RISING);//设置编码器A相位上升沿中断
  attachInterrupt(1, counter1, RISING);//设置编码器B相位上升沿中断
  Timer1.initialize(50000); // 设置定时器中断时间,单位微秒
  Timer1.attachInterrupt( timerIsr ); // 打开定时器中断
  interrupts();  //打开外部中断
}
void loop()
{ 
   
  long lTemp = 0; //定义临时存储数据变量
  if(j==1)   //判断是否发生定时器中断,即定时时间是否到达
   { 
   
       j=0; }
      int v1=(int)v;
       analogWrite(9,PIDControl_L(50,v1));
       analogWrite(8,0);
       
     
}
//外部中断处理函数
void counter0()
{ 
   
     counter_val0++;    //每一个中断加一
}
void counter1()
{ 
   
     counter_val1++;    //每一个中断加一
}
//定时器中断处理函数
void timerIsr()
{ 
   
   j=1;     //定时时间达到标志 
   v=1200*counter_val0/150.0;

         Serial.println(v);  
   
   counter_val0=0;
   counter_val1=0;
   return v;
}


float PIDControl_L(int SpeedSet,int speed)        //pid
{ 
   
    float Kp=50,Ki=9,kd=0.1;
    float cap;  
   int e=0,e1=0,e2=0;       
   static float PwmControl;
    static  float  pwm;
    e2=e1; 
    e1 = e; 
    e=SpeedSet-speed;
    PwmControl+=Kp *(e-e1)+ Ki*e+kd*(e-2e1+e2); 
    pwm=map(PwmControl,0, 60, 0, 255);
         
  
    cap = pwm;             
 
    return pwm;
}

`

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187028.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信本地数据库解密[通俗易懂]

    微信本地数据库解密[通俗易懂]微信本地数据库解密(安卓)微信的本地数据库EnMicroMsg.db存储在/data/data/com.tencent.mm/MicroMsg/(一长串)/中uin存储在/data/data/com.tencent.mm/shared_prefs/com.tencent.mm_preferences.xml(或auth_hold_prefs.xml)中,IMEI存储在/data/data/…

    2022年6月1日
    38
  • 一文说清文本编码那些事

    一文说清文本编码那些事

    2020年11月20日
    188
  • java用户态和内核态「建议收藏」

    java用户态和内核态「建议收藏」在&lt;深入理解java虚拟机&gt;这本书上多次看到用户态和内核态两个名词,虽然大概能明白意思.但对于两者具体的定义和区别还是比较,特此查阅之后记录.内核态(KernelMode)与用户态(UserMode)内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡.CPU也可以将自己从一个程序切换到另一个程序用户态:只能受限的访问内存,且不允许访问外…

    2022年9月17日
    0
  • PLSQL Developer连接Oracle11g 64位数据库配置详解

    PLSQL Developer连接Oracle11g 64位数据库配置详解最近换了台64bit的电脑,所以oracle数据库也跟着换成了64bit的,不过问题也随之产生,由于plsqldeveloper暂时没有64bit版本的,所以无法连接到64bit的oracle上,经过一番折腾,终于成功连接到数据库上,现记录下配置过程,以便查看。

    2022年5月26日
    52
  • TS助手 v3.52 视频网站下载工具,网页视频下载神器

    TS助手 v3.52 视频网站下载工具,网页视频下载神器TS的全称则是TransportStream,即传输流,DVD节目中的MPEG2格式,是MPEG2-PS,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的,m3u8是一个TS切片列表文件,它记录视频的每个切片的时长与顺序。现主流视频网站都采用这种模式。正因为如此,很多网友遇到这种TS传输流的视频,就有点束手无策了,今天给大家带来的这款TS助手可以轻松帮大家解决视频…

    2022年7月18日
    15
  • mysql的int最大值_MySQL中int最大值深入讲解

    mysql的int最大值_MySQL中int最大值深入讲解导语前两天看到的问题,展开写一下。字节我们都知道计算机是以二进制为基础。存储的基本单位是Bit,也称为比特、二进制位。1bit可以表示0或者1两个数字,是可能存在的最小的信息量,任何小于1bit的内容都算不上信息。复杂的内容就要用多bit来表示。Byte,也称为字节,通常用作计量单位。1byte等于8bit,即1byte可以表示28内容。MySQL中的字节…

    2025年7月13日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号