单片机测电机霍尔传感器_霍尔流量传感器 单片机 - CSDN
  • 本设计利用STC89C51/52单片机作为主控制器,采用霍尔传感器非接触式测电机转速,LCD1602液晶显示当前的转速,转速单位为转/分(RPM)和显示当前的pwm占空比0~100%,电机的速度可以通过按键调整,也可以开始暂停,正...
  • 基于51单片机霍尔传感器测速

    千次阅读 2020-03-26 17:25:14
    本 系 统 以 52 单 片 机 为 核 心 , 采 用 霍 尔 元 件 速 法 量 直 流 电 机 的 转 速 。 通 过 霍 尔 传 感 器 电 路 产 生 的 秒 脉 冲 信 号 传 给 单 片 机 , 单 片 机 经 过 处 理 和 计 算 , 量...

    1、设计需求及目标

    ①本设计采用STC89C51/52单片机作为主控制器

    ②采用霍尔传感器非接触式测电机转速

    ③LCD1602液晶显示当前的转速,转速单位为转/分(RPM)和显示当前的pwm占空比0~100%。

    ④电机的速度可以通过按键调整,也可以开始暂停,正转和反转。

    2、设计思路及方案

    本 系 统 以 52 单 片 机 为 核 心 , 采 用 霍 尔 元 件 测 速 法测 量 直 流 电 机 的 转 速 。 通 过 霍 尔 传 感 器 电 路 产 生 的 秒
    脉 冲 信 号 传 给 单 片 机 , 单 片 机 经 过 处 理 和 计 算 , 测 量出 的 速 度 将 显 示 在 1602 液 晶 显 示 器 上 。

    3、程序主函数

    /*********************************************************************
    功能:霍尔传感器测速,霍尔传感器的信号输出脚接T1(P3.5)引脚
    测量范围;假设转盘只有一个磁钢,转速低于10r/S则显示0,高于655360r/s则计数溢出(一般应用不会超出此限)
    
    *******************************************************************/
    #include <reg51.h>
    #define N 1//转盘上所安装的磁钢个数
    sbit DLed1=P2^0;//定义第一位数码管"位选"控制线的别名
    sbit DLed2=P2^1;//定义第二位数码管"位选"控制线的别名
    sbit DLed3=P2^2;
    sbit DLed4=P2^3;
    
    unsigned int speed=0;//最后的转速值
    unsigned int count=0;//在指定时间内记到的外部脉冲数
    unsigned char k=0;
    unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    void disp(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4);//子函数前向声明
    
    /*********************************
    函数名称:void delay1ms(unsigned int k)
    功能:延时子函数
    入口参数:延时时长
    返回值:无
    **********************************/
    void delay1ms(unsigned int k)
    { 
      unsigned char n,m;
      for(m=0;m<k;m++)
      {for(n=0;n<115;n++);}
    }
    //===================主函数
    void main()
    {
    unsigned char n;
    //EA=0;
    TMOD=0x51;//0101 0001,T1纯软件启动,计数模式,工作方式1;T0纯软件启动,定时模式,工作方式1
    TH0=0x3c;//12M晶振,定时50ms
    TL0=0xb0;
    
    ET0=1;//开启定时0中断
    EA=1;//开启总中断
    TR0=1;//同时启动定时与计数
    TR1=1;
       while(1)
    	{	  
    	speed=count/N;//结果为:x转/s,注意防止其越界	
    		for(n=20;n>0;n--)//稳定显示一阵
    		{
    		   disp(speed/1000,speed%1000/100,speed%100/10,speed%10);
    		   		
    			
    		}
    		TR0=1;//再次启动定时和计数功能,为下一次的测量作准备
    		TR1=1;
    	}
    
    
     
    
    }
    /*********************************
    函数名称:
    功能:T0中断处理函数
    说明:定时时间到,则关闭定时器,取出计数值
    入口参数:
    返回值:
    **********************************/
    void int0_fun() interrupt 1
    {
    k++;
    TH0=0x3c;//重载定时器T0初值
    TL0=0xb0;
    if(k>=20)//100ms的定时时间到
    {
    	TR0=0;
    	TR1=0;
    	count=TH1*256+TL1;
    	TH1=0x00;//清除计数值
    	TL1=0x00;
    	k=0;  //清除标志变量
    }
    }
    
    /********************************
    功能:显示函数
    四位数码管的显示函数
    段选:P1
    位选:P20-P23
    注意:采用的共阳数码管
    ***************************/
    void disp(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4)
    {
        DLed1=1;DLed2=0;DLed3=0;DLed4=0;//送位码,只让第一位数码管显示
    	P1=tab[x1];//送段码
    	delay1ms(10);//延时
    	P1=0xff;//关闭
    	
    	//----扫描显示第二位数码管------
    	DLed1=0;DLed2=1;DLed3=0;DLed4=0;
    	P1=tab[x2];
    	delay1ms(10);
        P1=0xff;
    
    	//----扫描显示第三位数码管------
    	DLed1=0;DLed2=0;DLed3=1;DLed4=0;
    	P1=tab[x3];
    	delay1ms(10);
    	P1=0xff;
    
    	//----扫描显示第四位数码管------
    	DLed1=0;DLed2=0;DLed3=0;DLed4=1;
    	P1=tab[x4];
    	delay1ms(10);
    	P1=0xff;
    }

    完整资料:

    https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=614515106970&ut_sk=1.WUpxx7gpwUoDAMmnnrBIzAno_12431167_1585213694840.Copy.detail.614515106970.1828622527&forceFlush=1

    展开全文
  • /**************************************************************** 外部晶振8M PA0~3:四位数码管的位选 PB0~7:数码管的8位段选 外部中断0用于计数 定时器0溢出中断的定时为1ms ...
    /****************************************************************
                    外部晶振8M
    				PA0~3:四位数码管的位选
    				PB0~7:数码管的8位段选
    				外部中断0用于计数
    				定时器0溢出中断的定时为1ms
    				说明 :检测到水流较小时,继电器延时1秒关闭
    ******************************************************************/				
    #include<iom16v.h>
    #include<macros.h>
    #define uchar unsigned char
    #define uint unsigned int
    
     char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //数码管段选
     
     char position[4]={0xfe,0xfd,0xfb,0xf7};//数码管位选
     
     uint sumnum=0;  //用于记录1000ms内进入中断的次数
     
     uint time=0;   //记录进入比较定时器0的次数
     
     uint num=0;     //记录1ms内进入中断的次数
     
     uint count=0;   //进入外部中断0的次数
     
     uchar flag;
     
     uint sumnum1;   //记录100ms内的数目
     
    /***************************函数声明***************************/
     
     void delay();
     
     void display(uint m );
     
     void init();
     
     void init_0();
     
     void init_2();
     void _delay_us(uint l)
    {
     	 unsigned int i;
    	 for(i=0;i<l;i++)
    	 {
    	 asm("nop");
    	 }
    }
     
     
    /**************************主函数***********************************/
    
     void main()
    {
     	 init();
    	 init_0();
     	 init_2();
    	 while(sumnum<5)
    	 {
    	  	PORTD=0XBF;
    	    segdisplay(sumnum1);
    	 }
    	while(1)
    	{
    	    segdisplay(sumnum1);
    	}
    	 
    }
     
     /*************************扫描数码管时的延时函数*********************/
     
     void delay()
     {
      	  uchar i,j;
    	  for(i=6;i>0;i--)
    	  for(j=225;j>0;j--);
     }
     
     /************************数码管显示函数*****************************/
     
    void segdisplay( int temp)
    	 {
    	  int seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    	  int temp1,temp2,temp3,temp4;
    	  temp1=temp/1000;
    	  temp2=(temp/100)%10;
    	  temp3=(temp/10)%10;
    	  temp4=temp%10;
    	  DDRB=0xff;
    	  DDRA|=0x0f;
    	    PORTA=~BIT(3);
    	  	PORTB=seg[temp1];
    		_delay_us(100);
    		PORTA=~BIT(2);
    		PORTB=seg[temp2];
    		_delay_us(100);
    		PORTA=~BIT(1);
    		PORTB=seg[temp3];
    		_delay_us(100);
    		PORTA=~BIT(0);
    		PORTB=seg[temp4];
    		_delay_us(100);
    	}
     
     /***********************管脚初始化函数*********************/
     
     void init()
     {
      	  
    	  	  DDRD|=0X40;   //PD4 设置为输出
    		  PORTD=0XBF;   
    	  	  DDRA=0XFF;
    		  DDRB=0XFF;
    		  PORTA=0XFF;
    		  PORTB=0XFF;
     }
     
     /***********************外部中断0初始化*********************/
     
     void init_0()
     {
      	  MCUCR=0X02;   //INT0为下降沿触发
    	  GICR=0X40;   //使能INT0中断
    	  SREG=0X80;  //使能总中断
     }
     
     /**********************定时器2初始化***********************/
     
     void init_2()
     {
      	  TCCR0=0x03;   // 内部时钟,64 分频(8M/64=125KHz) 
          TCNT0=0x83;   //装初值  
          TIMSK=0x01;   // 允许 T/C0溢出中断中断  
     }
    
    
     /***********************外部中断0子函数********************/
    	 #pragma interrupt_handler int0_isr:2
    	 void int0_isr(void)
    	 {
    	  	  count++;
    	 } 
    	/*********************定时计数器0溢出中断子函数*****************/
    	#pragma interrupt_handler int0_over:10 
    	void int0_over(void)
    	{
    	 	TCNT0=0x83;   //重装初值 
    		if((time%100) == 0)
    			sumnum1 = num;
    	 	if(time == 1000)
    		{
    			sumnum=num;
    			if(sumnum<10)
    			{
    			    
    				if((flag==1)&&(sumnum<10))
    				{
    				 	PORTD=0XFF;
    					flag=0;
    				}				
    					flag++;
    			}
    			else
    					PORTD=0XBF;
    			num=0;
    			time=0;
    		}
    	 	num+=count;
    		count=0;
    		++time; 
    	} 
    

    展开全文
  • 采用霍尔传感器非接触式测电机转速 · 3.LCD1602液晶显示当前的转速,转速单位为转/分(RPM)。和显示当前的pwm占空比0~100%。 · 4.电机的速度可以通过按键调整,也可以开始暂停,正转和反转。 注意:磁铁和霍尔...

    1.本设计采用STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机作为主控制器
    · 2.采用霍尔传感器非接触式测电机转速
    · 3.LCD1602液晶显示当前的转速,转速单位为转/分(RPM)。和显示当前的pwm占空比0~100%。
    · 4.电机的速度可以通过按键调整,也可以开始暂停,正转和反转。
    注意:磁铁和霍尔元件最近距离在2mm左右,太近可能会在电机转动时碰到霍尔元件,太远霍尔元件可能会检测不到磁铁。
    使用说明:
    液晶屏第一行显示电机转速,第二行显示占空比,占空比数值越大,电机转速越快。
    系统一共有6个按键,单片机附近的独立按键是系统的复位按键,按下单片机会复位。
    下面一排是控制按键:
    1键:加速键,可以短按,占空比加1,也可长按,占空比连续加;
    2键:减速键,可以短按,占空比减1,也可长按,占空比连续减;
    3键:正转切换键,按下后电机正转;
    4键:反转切换键,按下后电机反转;
    5键:开始暂停键,按一下开始,再按一下暂停。

    1.本选题的理由及意义
    现在电气传动的主要方向之一是电机调速系统采用微处理器实现数字化控制,近年来,随着科技的进步,直流电机得到了越来越广泛的应用,直流具有优良的调速特性,调速平滑,方便,调速范围广,过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速起动、制动和反转,需要满足生产过程自动化系统各种不同的特殊要求,从而对直流电机提出了较高的要求,改变电枢回路电阻调速、改变电压调速等技术已远远不能满足现代科技的要求,并且随着现代化生产规模的不断扩大,各个行业对直流电机的需求愈益增大,并对其性能提出了更高的要求。为此,研究并制造高性能、高可靠性的直流电机控制系统有着十分重要的现实意义。
    本题正是以此为出发点, 利用单片机来实现对电机转速的监测和控制。
    2.需要重点研究的关键问题及解决问题的思路
    关键问题一:如何选择合适的单片机
    如何选择合适的单片机是本课题待解决的第一个问题。综合各方面因素考虑,本课题将采用AT89S52,利用AT89S52芯片进行低成本直流电动机控制系统的设计,能够简化系统构成、降低系统成本、增强系统性能、满足更多应用场合的需要。系统实现对电机的正转、反转、急停、加速、减速的控制。
    关键问题二:如何选择合适的电机驱动
    如何选择合适的电机驱动是本课题待解决的第二个问题。综合各方面因素考虑,本课题将采用三极管驱动电机
    关键问题三:采用何种方法来改变占空比
    如何选改变占空比是本课题待解决的第三个问题。改变占空比的方法通常有定宽调频法,调频调宽法,定频调宽法,由于前两种方法在调速时改变了控制脉冲的周期(或频率),当控制脉冲的频率与系统的固有频率接近时,将会引起震荡,因此采用定频调宽法来改变占空比。
    关键问题四:软件编程及调试
    软件编程及调试是本题待解决的第四个问题,也是最为重要关键的问题,关系着该系统能否实现其功能。
    3.创新点及实践价值
    PWM-脉冲宽度调制技术,通过对微处理器输出的一系列数字脉冲宽度进行调制,等效地获得模拟电路所需的波形,从而实现对模拟电路控制的一种有效技术。采用PWM技术可以避免传统调速系统模拟电路容易随时间飘移、产生一些不必要的热损耗、以及对噪声敏感等缺点,并且PWM调速系统低速特性好,动态抗干扰能力强的特点.由此来实现直流电机的启动、停止、加速、减速、正转、反转以及速度的动态显示,并且大幅度提高了转速显示的精确性。
    4.完成本选题所需的工作条件(如资料、工具书、计算机设计绘图、实验、调研)及解决办法
    工具:
    (1)直流电机原理简述的相关资料
    (2) PWM控制转速等的一些资料
    (3) 模电、数电书籍
    (4) 焊接工具一套

    67-元件清单

    1. 9*15万用板
    2. STC89C51单片机
    3. 40脚IC座
    4. 1602液晶
    5. 16p母座
    6. 16p排针
    7. 10k电阻*3
    8. 1k电阻*5
    9. 3v直流电机
    10. 3*1万用板
    11. 磁铁*2
    12. 塑料管
    13. 3144霍尔传感器
    14. 4148二极管*4
    15. 8050三极管*4
    16. 8550三极管*2
    17. 103排阻
    18. 104独石电容
    19. 10uf电解电容
    20. 30pf瓷片电容*2
    21. 12M晶振
    22. 按键*6
    23. 自锁开关
    24. DC电源插口
    25. 导线若干
    26. 焊锡若干
    27. USB电源线或电池盒

    制作出来的实物:
    在这里插入图片描述
    单片机直流电机控制转速仿真原理图如下
    在这里插入图片描述
    在这里插入图片描述
    电路原理图如下:
    在这里插入图片描述
    PCB图如下:
    在这里插入图片描述
    部分源代码:
    #include <reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    void displaym();
    sbit en=P2^5; //1602 6管脚
    sbit rs=P2^7; //1602端口 4管脚
    sbit rw=P2^6;//lcd1602控制端口 5管脚
    sbit num1=P1^0; //占空比加1
    sbit num2=P1^1; //占空比减一
    sbit num3=P1^2; //正传
    sbit num4=P1^3; //反转
    sbit num5=P1^4; //开始停止切换

    sbit out=P3^4; //PWM输出用于正传
    sbit out1=P3^7; //PWM输出用于反转

    uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;

    void delay(uint z)//延时1ms函数
    {

    uint x,y;
    for(x=0;x<z;x++)
    for(y=0;y<110;y++);
    }

    void write_com(uchar com)//向1602写一字节(控制指令)
    {
    rs=0;
    P0=com;
    delay(5);
    en=0;
    delay(10);
    en=1;
    }
    void write_data(uchar date)//向1602写一字节(数据)
    {
    rs=1;
    P0=date;
    delay(5);
    en=0;
    delay(5);
    en=1;
    }
    void init()//初始化函数
    {
    en=0;
    rw=0;
    write_com(0x01); //lcd初始化
    write_com(0x38); //5X7显示
    write_com(0x0c); //关闭光标
    TMOD=0x01; //定时器方式1
    TH0=0xdc;
    TL0=0x00; //定时器装入初值
    EA=1; //开总中断
    ET0=1; //定时器0开中断
    TR0=1;
    EX1=1;
    IT1=1; //定时器启动
    TH1=0xfc;
    TL1=0x66;//定时100us
    ET1=1; //定时器1开中断
    TR1=1;
    write_com(0x80);
    write_data(‘V’);
    write_data(’:’);
    write_com(0x87); //第一行显示转速
    write_data(‘r’);
    write_data(‘p’);
    write_data(‘m’);
    write_com(0xc0);
    write_data(‘z’);
    write_data(‘h’);
    write_data(‘a’);
    write_data(‘n’);
    write_data(‘k’);
    write_data(‘o’);
    write_data(‘n’);
    write_data(‘g’);
    write_data(‘b’);
    write_data(‘i’); //在第二行显示zhankongbi:
    write_data(’:’);
    displaym();
    }
    void keyscan() //键盘扫描函数
    {
    if(num10)
    {
    delay(5); //消除抖动
    if(num1
    0)
    {
    if(m<=199)
    m++;
    displaym(); //设定占空比加一
    }
    }
    if(num20)
    {
    delay(5);
    if(num2
    0)
    {
    if(m>=1)
    m–;
    displaym(); //设定占空比减一

         }
    

    }
    if(num30)
    {
    delay(5);
    if(num3
    0)
    {
    zheng=1; //正传标志置1
    fan=0; // 反转标志置0

         }
    

    }
    if(num40)
    {
    delay(5);
    if(num4
    0)
    {
    zheng=0; //正传标志置0
    fan=1; // 反转标志置1

         }
    

    }
    if(num50)
    {
    delay(5);
    if(num5
    0)
    {
    while(num5==0) ;
    kai=1-kai;
    }
    }
    }
    void display()
    {
    write_com(0x82);
    zhuansu=zhuansu*30; //将两秒内的计数乘以30得到转每分

    if(zhuansu/10000!=0)
    write_data(zhuansu/10000+0x30); //如果转速的万位不为0 正常显示否则显示空格
    else
    write_data(’ ');

    if(zhuansu/1000==0)
    write_data(’ ');
    else
    write_data(zhuansu%10000%1000+0x30); //如果转速小于1000 千位为空格 否则正常显示

    if(zhuansu/100==0)
    write_data(’ ');
    else
    write_data(zhuansu%10000%1000/100+0x30); //如果转速小于100 百位为空格 否则正常显示

    if(zhuansu/10==0)
    

    write_data(’ ');
    else
    write_data(zhuansu%10000%1000%100/10+0x30); //如果转速小于10 十位为空格 否则正常显示

    write_data(zhuansu%10000%1000%100%10+0x30);
    write_com(0xd0); //如果没有这句,当中断内的显示函数执行完,就会在转速的位置显示占空比数据,导致乱码
    }
    void displaym()
    {
    write_com(0xcb);
    if(m/200%10!=0)
    write_data(m/200%10+0x30); //如果占空比百位不为0则显示百位否则显示空格
    else
    write_data(’ ');

    if(m/200%100&&m/20%100)
    write_data(’ ');
    else
    write_data(m/20%10+0x30); //如果占空比小于10 十位正常显示 否则显示空格

    write_data(m/2%10+0x30); //显示个位
    }
    void main()
    {
    flag_1=0;
    m=100; //占空比为100
    zhuansu=0; //转速初值0
    flag=0;
    zheng=1; //初始化电机正转动
    fan=0;

    init();              //初始化
    
        while(1)
        {
        keyscan();                                //键盘扫描程序
    
    
    
          
        }
    

    }
    void int1()interrupt 2 //外部中断1脉冲技术记录电机的转速 电机转一圈zhuansu加一
    {
    zhuansu++;
    }
    void int2()interrupt 3 //定时器0显示转速
    {

    TH0=0xdc;
    TL0=0x00;//定时10ms
    flag++;

    if(flag==200) //计时到达2s
    {

        display();                                        //显示转速
        zhuansu=0;                                          //转速置0
        flag=0;
    
        }
    

    }
    void int3()interrupt 1 //产生PWM
    {

    TH1=0xff;
    。。。。。。。。。。

    …………限于本文篇幅有限 完整代码请从文章中下载附件…………

    最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
    如果需要 完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。

    谢谢!

    展开全文
  • 【STM32】STM32之霍尔传感器模块

    万次阅读 多人点赞 2017-03-06 23:49:34
    本文介绍如何在STM32上使用霍尔传感器模块

    本篇博文最后修改时间:2017年03月06日,23:50。


    一、简介

    本文介绍如何在STM32上使用霍尔传感器模块


    二、实验平台

    库版本:STM32F10x_StdPeriph_Lib_V3.5.0

    编译软件:MDK4.53

    硬件平台:STM32开发板(主芯片stm32f103c8t6)

    仿真器:JLINK


    版权声明

    博主:甜甜的大香瓜

    声明:喝水不忘挖井人,转载请注明出处。

    原文地址:http://blog.csdn.NET/feilusia

    联系方式:897503845@qq.com

    香瓜BLE之CC2541群:127442605

    香瓜BLE之CC2640群:557278427

    香瓜BLE之Android群:541462902

    香瓜单片机之STM8/STM32群:164311667
    甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

    四、实验前提
    1、在进行本文步骤前,请先阅读以下博文:
    暂无

    2、在进行本文步骤前,请先实现以下博文:

    暂无


    五、基础知识

    1、霍尔传感器是什么?

    答:霍尔传感器是根据霍尔效应制作的一种磁场传感器

    用磁铁去靠近霍尔传感器时,霍尔传感器的引脚电平会产生变化。


    2、霍尔传感器主要用在什么地方?

    答:霍尔传感器可测速、计数、限位上。

    举例限位功能:两个霍尔传感器形成45°的夹角,电机边缘粘着一个磁铁,一旦电机转动导致磁铁触发任意其中一个霍尔传感器,则STM32检测到触发后立刻停止电机,不能再继续往此方向转动。以此达到限制电机转动角度的作用。


    3、本文使用的是什么霍尔传感器模块

    答:


    香瓜买的霍尔传感器模块一共有四个引脚,GND、VCC、D0、A0。

    其中只需要用到三根线,GND、VCC、D0。(A0不知做啥用的,计数?)

    使用方法:

    1)5V供电。

    2)用跳线连接D0和STM32的IO口(本文连接的是PA11)。

    3)D0默认是高电平,但磁铁的特定一面(磁铁另一面无用)去靠近霍尔传感器模块时,D0会被拉低。


    4、霍尔传感器与限位开关有什么区别?

    答:

    1)限位开关

    ①优点:无功耗。

    ②缺点:易损坏。


    2)霍尔传感器

    ①优点:不易损坏。

    ②缺点:有功耗。


    六、实验步骤

    1、编写并添加霍尔传感器驱动

    1)编写驱动GUA_Hall_Sensor.c(存放在“……\HARDWARE”)

    //******************************************************************************              
    //name:             GUA_Hall_Sensor.c             
    //introduce:        霍尔传感器驱动      
    //author:           甜甜的大香瓜                     
    //email:            897503845@qq.com     
    //QQ group          香瓜单片机之STM8/STM32(164311667)                  
    //changetime:       2017.03.06                     
    //******************************************************************************
    #include "stm32f10x.h" 
    #include "GUA_Hall_Sensor.h"
    
    /*********************宏定义************************/
    //霍尔传感器引脚
    #define GUA_HALL_SENSOR_PORT               GPIOA
    #define GUA_HALL_SENSOR_PIN                GPIO_Pin_11
    
    //消抖总次数
    #define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT      500000
    /*********************内部变量************************/
    static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;			//消抖时的空闲状态计数值
    static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;	//消抖时的触发状态计数值
    
    /*********************内部函数************************/ 
    static void GUA_Hall_Sensor_IO_Init(void);
    
    //******************************************************************************            
    //name:             GUA_Hall_Sensor_IO_Init           
    //introduce:        霍尔传感器的IO初始化         
    //parameter:        none                 
    //return:           none         
    //author:           甜甜的大香瓜                 
    //email:            897503845@qq.com     
    //QQ group          香瓜单片机之STM8/STM32(164311667)                  
    //changetime:       2017.03.06                     
    //******************************************************************************
    static void GUA_Hall_Sensor_IO_Init(void)
    {	
    	//IO结构体
    	GPIO_InitTypeDef GPIO_InitStructure;
    		
    	//时钟使能
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 	
    	
    	//霍尔IO配置
    	GPIO_InitStructure.GPIO_Pin = GUA_HALL_SENSOR_PIN;  		
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
    	GPIO_Init(GUA_HALL_SENSOR_PORT, &GPIO_InitStructure);	
    }
    
    //******************************************************************************        
    //name:             GUA_Hall_Sensor_Check_Pin        
    //introduce:        霍尔传感器检测触发状态     
    //parameter:        none       
    //return:           GUA_HALL_SENSOR_STATUS_IDLE or GUA_HALL_SENSOR_STATUS_TRIGGER     
    //author:           甜甜的大香瓜             
    //email:            897503845@qq.com     
    //QQ group          香瓜单片机之STM8/STM32(164311667)                  
    //changetime:       2017.03.06                     
    //******************************************************************************  
    GUA_U8 GUA_Hall_Sensor_Check_Pin(void)    
    {    
      //没触发
      if(GPIO_ReadInputDataBit(GUA_HALL_SENSOR_PORT, GUA_HALL_SENSOR_PIN) == SET) 
      {
        //计数
        sGUA_Hall_Sensor_DisapperasShakes_IdleCount++;
        sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;
        
        //判断计数是否足够
        if(sGUA_Hall_Sensor_DisapperasShakes_IdleCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
        {
          return GUA_HALL_SENSOR_STATUS_IDLE;    
        }
      }
      //触发
      else
      {
        //计数
        sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;
        sGUA_Hall_Sensor_DisapperasShakes_TriggerCount++;
        
        //判断计数是否足够
        if(sGUA_Hall_Sensor_DisapperasShakes_TriggerCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
        {
          return GUA_HALL_SENSOR_STATUS_TRIGGER;    
        }    
      }  
      
      return GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS;  
    } 
    
    //******************************************************************************        
    //name:             GUA_Limit_Switch_Init        
    //introduce:        霍尔传感器初始化     
    //parameter:        none       
    //return:           none      
    //author:           甜甜的大香瓜             
    //email:            897503845@qq.com     
    //QQ group          香瓜单片机之STM8/STM32(164311667)                  
    //changetime:       2017.03.06                     
    //****************************************************************************** 
    void GUA_Hall_Sensor_Init(void)
    {
      //初始化IO
      GUA_Hall_Sensor_IO_Init();	  
    }
    

    2)编写驱动头文件GUA_Hall_Sensor.h(存放在“……\HARDWARE”)
    //******************************************************************************              
    //name:             GUA_Hall_Sensor.h             
    //introduce:        霍尔传感器驱动的头文件      
    //author:           甜甜的大香瓜                     
    //email:            897503845@qq.com         
    //QQ group          香瓜单片机之STM8/STM32(164311667)                      
    //changetime:       2017.03.06                     
    //****************************************************************************** 
    #ifndef _GUA_HALL_SENSOR_H_
    #define _GUA_HALL_SENSOR_H_
     
    /*********************宏定义************************/  
    //类型宏
    #ifndef GUA_U8        
    typedef unsigned char GUA_U8;        
    #endif    
    
    #ifndef GUA_8        
    typedef signed char GUA_8;        
    #endif      
          
    #ifndef GUA_U16        
    typedef unsigned short GUA_U16;        
    #endif 
    
    #ifndef GUA_16        
    typedef signed short GUA_16;        
    #endif         
          
    #ifndef GUA_U32        
    typedef unsigned long GUA_U32;        
    #endif 
    
    #ifndef GUA_32        
    typedef signed long GUA_32;       
    #endif
    
    #ifndef GUA_U64    
    typedef unsigned long long GUA_U64;  
    #endif
    
    #ifndef GUA_64    
    typedef signed long long GUA_64;  
    #endif
    
    //霍尔传感器的触发状态
    #define GUA_HALL_SENSOR_STATUS_TRIGGER                      0		//霍尔传感器触发
    #define GUA_HALL_SENSOR_STATUS_IDLE                         1		//霍尔传感器没触发
    #define GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS             2		//霍尔传感器消抖中
    
    /*********************外部函数声明************************/ 
    GUA_U8 GUA_Hall_Sensor_Check_Pin(void);  
    void GUA_Hall_Sensor_Init(void);
    
    #endif
    

    3)工程中添加GUA_Hall_Sensor.c



    4)在MDK设置中添加串口驱动源文件路径



    2、在应用层中调用

    1)添加驱动头文件(main.c中)

    #include "GUA_Hall_Sensor.h"

    2)添加驱动初始化代码(main.c的main函数中)

      //霍尔传感器初始化
      GUA_Hall_Sensor_Init(); 

    3)添加测试代码

    ①写测试代码main.c中

    static void GUA_Test(void)
    {   
      U8 nGUA_Ret = 0;
      U8 nGUA_Stop = 0;
    	
      while(1)
      {
    		//检测霍尔当前状态
    		nGUA_Ret = GUA_Hall_Sensor_Check_Pin();
    		
    		//检测到霍尔被触发
    		if(nGUA_Ret == GUA_HALL_SENSOR_STATUS_TRIGGER)
    		{
    			nGUA_Stop = 1;
    		} 
    }

    ②调用测试代码main.c的main函数中

    	//测试代码
    	GUA_Test();

    七、注意事项

    暂无。


    八、实验结果

    仿真并设置断点在测试代码的“nGUA_Stop = 1;”中,全速运行。

    用磁铁去靠近模块上的霍尔传感器芯片,模块上的led被点亮表示触发,同时工程中消抖之后会停止在断点处,表示检测到PA11处的霍尔传感器触发导致的低电平。如下图


    因此实验成功。




    展开全文
  • 本文介绍如何在STM32上使用霍尔传感器模块检测电机运行位置,当电机归位时自动断开电源
  • 原理:转子电角度旋转一圈为360度,hall传感器根据转子位置可以输出6种不同的编码代表6个不同的扇区。 通过测量转子在每一个扇区的时间估算出转子速度,根据速度估算出电角度。当发生扇区切换时校准转子电角度。 ...
  • 举例限位功能:两个霍尔传感器形成45°的夹角,电机边缘粘着一个磁铁,一旦电机转动导致磁铁触发任意其中一个霍尔传感器,则STM32检测到触发后立刻停止电机,不能再继续往此方向转动。以此达到限制电机转动角度的...
  • 本次博文想记录一下32单片机连接霍尔传感器测量直流电机转速。 材料准备: 1.单片机:STM32L052K8* 2.霍尔传感器 3.直流电机 电路图如下: 其中,单片机和直流电机不用介绍,下面介绍一下霍尔传感器。 ...
  • 基于霍尔传感器电机转速的单片机测量 有需要的吗
  • 基于STM8S单片机的无刷电机驱动程序,基于霍尔传感器的信号检测
  • 霍尔传感器的无刷电机控制程序

    热门讨论 2020-07-22 12:36:22
    霍尔传感器的无刷电机控制程序(PWM调速) 基于单片机编写的C程序
  • 这里我用通用定时器3的通道1来测量转速霍尔转速传感器基本介绍霍尔传感器分类和原理关于为什么选用开关型常开PNP型霍尔传感器STM32程序实现程序介绍程序源码TIM3_CAP.HTIM3_CAP.CMAIN.C 霍尔转速传感器基本介绍 霍尔...
  • 4.2 霍尔传感器简介 15 4.2.1 霍尔器件概述 15 4.2.2 霍尔传感器的应用 16 4.2.3 AH41霍尔开关 17 4.3 发送模块 18 5 软件设计 22 5.1 单片机转速程序设计思路及过程 22 5.1.1 单片机程序设计思路 22 5.1.2 单片机...
  • 好消息:请在手机淘宝或闲鱼上搜索“电子入门趣谈”,有惊喜哦 :)我把全本电子入门趣谈的电子版(包括科技提升和理论升华部分,共计50余万字)放到上面开始兜售啦,...3.2.3 霍尔传感器 (1)霍尔传感器简介 在金...
  • 文章目录【实验目的】【实验原理】【实验环境】硬件设备:软件环境:【实验步骤】第一步 配置工程...熟悉编码器的输出形式,熟悉单片机如何通过编码器的输出得到电机的旋转方向和速率; 掌握STM32F10xx系列微控制器...
  • 单片机采用15W408AS芯片,与霍尔传感器连接,发送指令回复速度
  • 本设计由STC89C52单片机核心电路+DS1302时钟电路+5V电机调速控制电路+霍尔测速电路+蜂鸣器报警电路+按键电路+LCD1602液晶显示电路+电源电路组成。 1、通过时钟芯片DS1302获取时间。 2、LCD1602可以显示当前的速度,...
  • 这篇论文是关于使用霍尔传感器测量电机转速的设计。通过霍尔传感器和磁体对电机的转速进行检测,然后通过串口将数据传送给上位机。上位机对数据进行保存和显示
  • 1、通过霍尔传感器测速,霍尔传感器检测轮盘上的磁铁进而知道轮盘转了多少周,从而计算出转速。 2、LCD1602液晶实时显示转速。 3、可以通过电位器调节电机的转速。 A3144霍尔传感器模块电路设计 本霍尔传感器模块是...
1 2 3 4 5 ... 17
收藏数 336
精华内容 134
关键字:

单片机测电机霍尔传感器