精华内容
下载资源
问答
  • 使用STM32控制角度传感器角度传感器的精度可达0.1度,角度范围为-90~90度,并通过1206液晶显示出来。
  • 角度传感器STM32

    2013-08-28 17:05:18
    我自己写的STM32角度传感器程序,分享下
  • mcu为stm32f103,传感器为360度角度传感器,使用adc方式读取角度信息,通过程序判断旋转圈数,上电零点检测.
  • stm32压力传感器步进电机

    千次阅读 2019-12-17 22:00:43
    基于stm32c8t6的压力传感器控制步进电机正反转。 主控:stm32c8t6 ,压力传感器:悬壁式压力传感器+HX711 ,步进电机:24BYJ48(电机)+ULN2003(驱动) 实现功能:通过压力传感器测量平台上的压力,在将数字量...

    基于stm32c8t6的压力传感器控制步进电机正反转。

    主控:stm32c8t6 ,压力传感器:悬壁式压力传感器+HX711 ,步进电机:24BYJ48(电机)+ULN2003(驱动)

    实现功能:通过压力传感器测量平台上的压力,在将数字量传输给单片机,单片机控制步进电机正反转。且可通过串口1发送数据

     

    HX711:

    HX711是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A 或通道B,与其内部的低噪声可编程放大器相连。通道A 的可编程增益为128 或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B 则为固定的32 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

     

     

     

    其余详细参数见百度https://baike.sogou.com/v74131339.htm?fromTitle=HX711

     

     

    悬臂式压力传感器

     

     

     

    底座必须固定!!!!另一端自由称重

     

    步进电机

     

    我们先来解释“4 相永磁式”的概念,28BYJ-48 的内部结构示意图 9-4 所示。先看里圈,它上面有 6 个齿,分别标注为 0~5,这个叫做转子,顾名思义,它是要转动的,转子的每个齿上都带有永久的磁性,是一块永磁体,这就是“永磁式”的概念。再看外圈,这个就是定子,它是保持不动的,实际上它是跟电机的外壳固定在一起的,它上面有 8 个齿,而每个齿上都缠上了一个线圈绕组,正对着的 2 个齿上的绕组又是串联在一起的,也就是说正对着的2 个绕组总是会同时导通或关断的,如此就形成了 4 相,在图中分别标注为 A-B-C-D,这就是“4 相”的概念。

     

    现在我们分析一下它的工作原理:

    假定电机的起始状态就如图 9-4 所示,逆时针方向转动,起始时是 B 相绕组的开关闭合,B 相绕组导通,那么导通电流就会在正上和正下两个定子齿上产生磁性,这两个定子齿上的磁性就会对转子上的 0 和 3 号齿产生最强的吸引力,就会如图所示的那样,转子的 0 号齿在正上、3 号齿在正下而处于平衡状态;此时我们会发现,转子的 1 号齿与右上的定子齿也就是 C 相的一个绕组呈现一个很小的夹角,2 号齿与右边的定子齿也就是 D 相绕组呈现一个稍微大一点的夹角,很明显这个夹角是 1 号齿和 C 绕组夹角的 2 倍,同理,左侧的情况也是一样的。

     

    接下来,我们把 B 相绕组断开,而使 C 相绕组导通,那么很明显,右上的定子齿将对转子 1 号齿产生最大的吸引力,而左下的定子齿将对转子 4 号齿,产生最大的吸引力,在这个吸引力的作用下,转子 1、4 号齿将对齐到右上和左下的定子齿上而保持平衡,如此,转子就转过了起始状态时 1 号齿和 C 相绕组那个夹角的角度。

     

    再接下来,断开 C 相绕组,导通 D 相绕组,过程与上述的情况完全相同,最终将使转子2、5 号齿与定子 D 相绕组对齐,转子又转过了上述同样的角度。

     

    那么很明显,当 A 相绕组再次导通,即完成一个 B-C-D-A 的四节拍操作后,转子的 0、3 号齿将由原来的对齐到上下 2 个定子齿,而变为了对齐到左上和右下的两个定子齿上,即转子转过了一个定子齿的角度。依此类推,再来一个四节拍,转子就将再转过一个齿的角度,8 个四节拍以后转子将转过完整的一圈,而其中单个节拍使转子转过的角度就很容易计算出来了,即 360 度/(8*4)=11.25 度,这个值就叫做步进角度。而上述这种工作模式就是步进电机的单四拍模式——单相绕组通电四节拍。

     

    我们再来讲解一种具有更优性能的工作模式,那就是在单四拍的每两个节拍之间再插入一个双绕组导通的中间节拍,组成八拍模式。比如,在从 B 相导通到 C 项导通的过程中,假如一个 B 相和 C 相同时导通的节拍,这个时候,由于 B、C 两个绕组的定子齿对它们附近的转子齿同时产生相同的吸引力,这将导致这两个转子齿的中心线对比到 B、C 两个绕组的中心线上,也就是新插入的这个节拍使转子转过了上述单四拍模式中步进角度的一半,即 5.625度。这样一来,就使转动精度增加了一倍,而转子转动一圈则需要 8*8=64 拍了。另外,新增加的这个中间节拍,还会在原来单四拍的两个节拍引力之间又加了一把引力,从而可以大大增加电机的整体扭力输出,使电机更“有劲”了。

     

    除了上述的单四拍和八拍的工作模式外,还有一个双四拍的工作模式——双绕组通电四节拍。其实就是把八拍模式中的两个绕组同时通电的那四拍单独拿出来,而舍弃掉单绕组通电的那四拍而已。其步进角度同单四拍是一样的,但由于它是两个绕组同时导通,所以扭矩会比单四拍模式大,在此就不做过多解释了。

     

    八拍模式是这类 4 相步进电机的最佳工作模式,能最大限度的发挥电机的各项性能,也是绝大多数实际工程中所选择的模式。

     

     

     

     

    硬件连接:

    串口1

    PA9 PA10

    HX711

    #define HX711_SCK PBout(0)// PB0

    #define HX711_DOUT PBin(1)// PB1

    ULN2003

    IN1:PA3 IN2:PA2 IN3:PA1 IN4:PA0

     

    软件代码

     

     

     

     

     

    展开全文
  • mcu为stm32f103,传感器为360度角度传感器,使用adc方式读取角度信息,通过程序判断旋转圈数,上电零点检测.
  • stm32 mma7455角度传感器I2C方式原码
  • STM32 磁场传感器HMC5883

    2019-09-27 15:47:05
    角度 = atan2(y,x) * (180 / π) + 180,这里角度用0~360°表示 X轴的正方向为正北 ,即上述0~360角度的180°表示正北,360°表示正南 转载于:https://www.cnblogs.com/Kevin127/p/5368652.html

    一、IIC协议

    默认(出厂) HMC5883LL 7 位从机地址为0x3C 的写入操作,或0x3D 的读出操作。

    要改变测量模式到连续测量模式,在通电时间后传送三个字节:0x3C 0x02 0x00

    将00写入第二寄存器或模式寄存器以完成从单一模式切换到连续测量模式的设置。随着数据速率在出厂默认的15Hz更新,在查询HMC5883L数据寄存器进行新的测量之前,I2C主机允许产生一个67毫秒的延迟。要计算新数据时钟,发送:0x3D,并记录下的DXRA,DXRB,DZRA,DZRB,DYRA,DYRB设在寄存器3到8上的时钟脉冲。HMC5883L,将自动重新点回寄存器3进行下一个0x3D的查询。全部六个寄存器在新的数据写入任何一个寄存器前必须正确读取

     

    (1)首先确定IIC从机地址,即IIC设备的地址查手册知为 0x3C

    (2)确定HMC5883_Init()初始化操作的配置。注意选择连续测量模式测量数据才能够实时变化

    HMC5883_WriteReg(0x00,0x14); //配置寄存器A:输出速率30HZ正常测量
    HMC5883_WriteReg(0x02,0x00); //配置模式寄存器:连续测量模式

    (3)读数据

    我们所需要的数据是X和Y,其中|是按位或,用来将X和Y的高位和低位加起来,先将MSB左移8位再与LSB按位或运算

    BUF[1]=Single_Read(HMC5883L_Addr,0x03);  
    BUF[2]=Single_Read(HMC5883L_Addr,0x04); 
    BUF[3]=Single_Read(HMC5883L_Addr,0x07); 
    BUF[4]=Single_Read(HMC5883L_Addr,0x08); 
    x=(BUF[1] << 8) | BUF[2];  
    y=(BUF[3] << 8) | BUF[4];  
    if(x>0x7fff)x-=0xffff;      
    if(y>0x7fff)y-=0xffff;      
    angle= atan2(y,x) * (180 / 3.14159265) + 180; 

     

    θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2]。

    θ = ATan2(y, x)求出的θ取值范围是[-PI, PI]。

    (二) 什么是磁偏角和方位公式

    磁偏角

    HMC5883三轴数位罗盘对角度的计算公式。

    angle= atan2(y,x) * (180 / 3.14159265) + 180; 

    其实就是这样的:
    角度 = atan2(y,x) * (180 / π) + 180,这里角度用0~360°表示

    X轴的正方向为正北 ,即上述0~360角度的180°表示正北,360°表示正南

    转载于:https://www.cnblogs.com/Kevin127/p/5368652.html

    展开全文
  • 基于STM32的高精度多圈绝对角度传感器.pdf
  • 目录A1333角度传感器硬件安装通信接口寄存器STM32控制部分电路原理图程序 A1333角度传感器 美国ALLEGRO型号A1333是一款360°角度传感器IC,可基于磁性圆形垂直霍尔(CVH)技术提供无接触,低延迟,高分辨率的角位置...

    A1333角度传感器

    美国ALLEGRO型号A1333是一款360°角度传感器IC,可基于磁性圆形垂直霍尔(CVH)技术提供无接触,低延迟,高分辨率的角位置信息。它具有系统片上(SoC)架构,包括:CVH前端,数字信号处理和电机换向(UVW)或编码器输出(A,B,I)。它还包括片上EEPROM技术,能够支持多达100个读/写周期,以便对校准参数进行灵活的终端编程。芯片图片:
    在这里插入图片描述
    结构框图:
    在这里插入图片描述
    数据手册下载

    硬件安装

    A1333是一款360°角度传感器IC,被测量部件可以采用永磁铁,并确保使用过程没有强磁干扰。由于测量的一般都是旋转部件,则采用圆形铷磁铁即可,此处需要注意圆形磁铁的极化方向,分为轴向和径向两种。根据芯片测量原理,我们需要采用径向铷磁铁。
    在这里插入图片描述
    采用直径10mm,厚度2.5mm圆形铷磁铁即可,磁铁轴心与芯片中心,需要尽可能在同一点上,若磁铁和芯片不在同一直线上,也会出现测量误差,示意图如下图:
    在这里插入图片描述
    装配时,铷磁铁与芯片之间的间隙,需要尽可能小,数据手册中有磁强和间隙大小以及角度误差之间的关系,为了减小误差建议间隙2mm以内。本文最终采用的铷磁铁如下:
    在这里插入图片描述

    通信接口

    A1333有两种编程方式:1.使用SPI接口进行输入和输出;2.输入使用曼彻斯特协议,输出使用PWM协议。本文使用SPI接口进行通信,所以只对SPI相关参数进行介绍。A1333的SPI接口提供四线全双工模式,CPHA=1,CPOL=1,总线时钟最低支持100KHz,最高支持10MHz,兼容3.3V和5V的IO模式。经典接线图如下:
    在这里插入图片描述
    A1333有三种数据帧格式,分别是16位、17位和20位的帧格式,其中20位帧格式实际上是16位数据加4位CRC校验位扩展而来,17位帧格式只有在使用扩展E2PROM才使用。如下图:
    在这里插入图片描述
    写寄存器
    写寄存器的数据帧格式由1bit的低位、1bit的R/W标志位(bit=1)、6bit的地址位和8bit的数据位组成,还可以拼接可选的4bitCRC校验位,如下图所示(注意MOSI线):
    在这里插入图片描述
    读寄存器
    读寄存器的操作,由至少两次SPI交互组成,第一次交互先发送需要读取的寄存器信息,此时读取回来的数据为上一次操作的数据;第二次可以发送一个空操作(读0x00寄存器)信息,此时读取回来的数据为所需的寄存器数据,其中第二次交互发送的数据帧,还可以是读操作数据帧,这样第三次交互就可以接到第二次读操作的数据了。读寄存器的数据帧格式由1bit的低位、1bit的R/W标志位(bit=0)、6bit的地址位和8bit的0组成,同样可以拼接4bit的CRC校验位。如下图所示:
    在这里插入图片描述

    寄存器

    这里主要介绍角度数据寄存器(0x32)和key寄存器(0x3c)。操作A1333的寄存器前,需要操作key寄存器进行解锁。
    数据寄存器(0x32)
    在这里插入图片描述
    读取出来的是15位数据,角度转换公式:ANGLE_15 × (360/32768)

    key寄存器(0x3c)
    在这里插入图片描述
    在寄存器操作前,需要先操作key寄存器进行解锁,解锁方法为向key寄存器写入5组KEYCODE,解锁成功后才可以进行其他寄存器操作,KEYCODE如下表:

    WriteCODE
    10x00
    20x27
    30x81
    40x1F
    50x77

    STM32控制部分

    电路原理图

    在这里插入图片描述

    程序

    a1333.c

    #include "a1333.h"
    
    const uint16_t WRITE = 0x40;
    const uint16_t READ = 0x00;
    const uint16_t COMMAND_MASK = 0xC0;
    const uint16_t ADDRESS_MASK = 0x3F;
    
    #define CS_H()	GPIO_SetBits(GPIOB,GPIO_Pin_12)
    #define CS_L()	GPIO_ResetBits(GPIOB,GPIO_Pin_12)
    
    static uint16_t spi2_rw(uint16_t cmd,uint16_t *value)
    {
    	u8 retry=0;	
    	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)
    	{
    		retry++;
    		if(retry>200)return 0;
    	}
    	SPI_I2S_SendData(SPI2, cmd); 
    	retry=0;
     
    	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) 
    	{
    		retry++;
    		if(retry>200)return 0;
    	}
    	if(value){
    		*value = SPI_I2S_ReceiveData(SPI2);
    	}else{
    		SPI_I2S_ReceiveData(SPI2);
    	}
    	
    	return 1;
    }
    
    
    static uint16_t PrimaryWrite(uint16_t address, uint16_t value)
    {
    	u8 s=0;
    	uint16_t command = ((address & ADDRESS_MASK) | WRITE) << 8;
    	
    	CS_L();
    	Delay_1us(1);
    	s = spi2_rw(command | ((value >> 8) & 0x0FF),0);
    	CS_H();
    	if(s == 0){
    		return 0;
    	}
    	
    	command = (((address + 1) & ADDRESS_MASK) | WRITE) << 8;
    	CS_L();
    	Delay_1us(1);
    	s = spi2_rw(command | (value & 0x0FF),0);
    	CS_H();
    	if(s == 0){
    		return 0;
    	}
    	return 1;
    }
    
    static uint16_t PrimaryRead(uint16_t address, uint16_t *value)
    {
    	u8 s=1;		
    	uint16_t command = ((address & ADDRESS_MASK) | READ) << 8;
    	CS_L();
    	Delay_1us(1);
    	s = spi2_rw(command,0);
    	CS_H();
    	if(s)
    	{
    		CS_L();
    		s = spi2_rw(command,value);
    		CS_H();
    		if(s)
    		{
    			return 1;
    		}
    		return 0;
    	}else{
    		return 0;
    	}
    }
    
    void a1333_init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	SPI_InitTypeDef  SPI_InitStructure;
    
    	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );
    	RCC_APB1PeriphClockCmd(	RCC_APB1Periph_SPI2,  ENABLE );
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	
    	GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); 
    
    	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
    	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		
    	SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;		
    	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;		
    	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;	
    	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		
    	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		
    	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    	SPI_Init(SPI2, &SPI_InitStructure);  
    
    	SPI_Cmd(SPI2, ENABLE);
    	
    	SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_RXNE);
    	
    	
    	{
    		u16 t = 0,flags;
    		PrimaryRead(0x00,&t);
    		
    			// Unlock the device
    		PrimaryWrite(0x3C, 0x2700);
    		PrimaryWrite(0x3C, 0x8100);
    		PrimaryWrite(0x3C, 0x1F00);
    		PrimaryWrite(0x3C, 0x7700);
    
    		// Make sure the device is unlocked
    		t = 100;
    		PrimaryRead(0x3C, &flags);
    		while ((flags & 0x0001) != 0x0001)
    		{
    			Delay_1us(10);
    			t--;
    			if (t==0)
    			{
    				LedSet(LED1);
    				LedReset(LED2);
    				while(1){
    					LedReverse(LED1 | LED2);
    					Delay_1ms(200);
    				}
    			}
    			PrimaryRead(0x3C, &flags);
    		}
    	}
    }
    
    uint16_t a1333_read_angle15(void){
    	uint16_t read_angle = 0;
    	PrimaryRead(0x32, &read_angle);
    	read_angle = read_angle & 0x7fff;
    	return read_angle;
    }
    
    uint16_t a1333_read_angle15_smooth(uint8_t sm){
    	uint8_t i;
    	uint32_t total = 0;
    	for(i=0;i<sm;i++){
    		total += a1333_read_angle15();
    	}
    	return total / sm;
    }
    
    

    a1333.h

    
    #ifndef __A1333_H__
    #define __A1333_H__
    
    #include "stm32f10x.h"
    
    void a1333_init(void);
    uint16_t a1333_read_angle15(void);
    uint16_t a1333_read_angle15_smooth(uint8_t sm);
    
    #endif
    
    展开全文
  • STM32STM32之霍尔传感器模块

    千次阅读 2019-03-12 17:18:42
    本文介绍如何在STM32上使用霍尔传感器模块。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 ...


    一、简介

    本文介绍如何在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”)

    
        
    1. //******************************************************************************
    2. //name: GUA_Hall_Sensor.c
    3. //introduce: 霍尔传感器驱动
    4. //author: 甜甜的大香瓜
    5. //email: 897503845@qq.com
    6. //QQ group 香瓜单片机之STM8/STM32(164311667)
    7. //changetime: 2017.03.06
    8. //******************************************************************************
    9. #include "stm32f10x.h"
    10. #include "GUA_Hall_Sensor.h"
    11. /*********************宏定义************************/
    12. //霍尔传感器引脚
    13. #define GUA_HALL_SENSOR_PORT GPIOA
    14. #define GUA_HALL_SENSOR_PIN GPIO_Pin_11
    15. //消抖总次数
    16. #define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT 500000
    17. /*********************内部变量************************/
    18. static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0; //消抖时的空闲状态计数值
    19. static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0; //消抖时的触发状态计数值
    20. /*********************内部函数************************/
    21. static void GUA_Hall_Sensor_IO_Init(void);
    22. //******************************************************************************
    23. //name: GUA_Hall_Sensor_IO_Init
    24. //introduce: 霍尔传感器的IO初始化
    25. //parameter: none
    26. //return: none
    27. //author: 甜甜的大香瓜
    28. //email: 897503845@qq.com
    29. //QQ group 香瓜单片机之STM8/STM32(164311667)
    30. //changetime: 2017.03.06
    31. //******************************************************************************
    32. static void GUA_Hall_Sensor_IO_Init(void)
    33. {
    34. //IO结构体
    35. GPIO_InitTypeDef GPIO_InitStructure;
    36. //时钟使能
    37. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    38. //霍尔IO配置
    39. GPIO_InitStructure.GPIO_Pin = GUA_HALL_SENSOR_PIN;
    40. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    41. GPIO_Init(GUA_HALL_SENSOR_PORT, &GPIO_InitStructure);
    42. }
    43. //******************************************************************************
    44. //name: GUA_Hall_Sensor_Check_Pin
    45. //introduce: 霍尔传感器检测触发状态
    46. //parameter: none
    47. //return: GUA_HALL_SENSOR_STATUS_IDLE or GUA_HALL_SENSOR_STATUS_TRIGGER
    48. //author: 甜甜的大香瓜
    49. //email: 897503845@qq.com
    50. //QQ group 香瓜单片机之STM8/STM32(164311667)
    51. //changetime: 2017.03.06
    52. //******************************************************************************
    53. GUA_U8 GUA_Hall_Sensor_Check_Pin(void)
    54. {
    55. //没触发
    56. if(GPIO_ReadInputDataBit(GUA_HALL_SENSOR_PORT, GUA_HALL_SENSOR_PIN) == SET)
    57. {
    58. //计数
    59. sGUA_Hall_Sensor_DisapperasShakes_IdleCount++;
    60. sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;
    61. //判断计数是否足够
    62. if(sGUA_Hall_Sensor_DisapperasShakes_IdleCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
    63. {
    64. return GUA_HALL_SENSOR_STATUS_IDLE;
    65. }
    66. }
    67. //触发
    68. else
    69. {
    70. //计数
    71. sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;
    72. sGUA_Hall_Sensor_DisapperasShakes_TriggerCount++;
    73. //判断计数是否足够
    74. if(sGUA_Hall_Sensor_DisapperasShakes_TriggerCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
    75. {
    76. return GUA_HALL_SENSOR_STATUS_TRIGGER;
    77. }
    78. }
    79. return GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS;
    80. }
    81. //******************************************************************************
    82. //name: GUA_Limit_Switch_Init
    83. //introduce: 霍尔传感器初始化
    84. //parameter: none
    85. //return: none
    86. //author: 甜甜的大香瓜
    87. //email: 897503845@qq.com
    88. //QQ group 香瓜单片机之STM8/STM32(164311667)
    89. //changetime: 2017.03.06
    90. //******************************************************************************
    91. void GUA_Hall_Sensor_Init(void)
    92. {
    93. //初始化IO
    94. GUA_Hall_Sensor_IO_Init();
    95. }

    2) 编写驱动头文件GUA_ Hall_Sensor.h(存放在“ …… \HARDWARE ”)
    
        
    1. //******************************************************************************
    2. //name: GUA_Hall_Sensor.h
    3. //introduce: 霍尔传感器驱动的头文件
    4. //author: 甜甜的大香瓜
    5. //email: 897503845@qq.com
    6. //QQ group 香瓜单片机之STM8/STM32(164311667)
    7. //changetime: 2017.03.06
    8. //******************************************************************************
    9. #ifndef _GUA_HALL_SENSOR_H_
    10. #define _GUA_HALL_SENSOR_H_
    11. /*********************宏定义************************/
    12. //类型宏
    13. #ifndef GUA_U8
    14. typedef unsigned char GUA_U8;
    15. #endif
    16. #ifndef GUA_8
    17. typedef signed char GUA_8;
    18. #endif
    19. #ifndef GUA_U16
    20. typedef unsigned short GUA_U16;
    21. #endif
    22. #ifndef GUA_16
    23. typedef signed short GUA_16;
    24. #endif
    25. #ifndef GUA_U32
    26. typedef unsigned long GUA_U32;
    27. #endif
    28. #ifndef GUA_32
    29. typedef signed long GUA_32;
    30. #endif
    31. #ifndef GUA_U64
    32. typedef unsigned long long GUA_U64;
    33. #endif
    34. #ifndef GUA_64
    35. typedef signed long long GUA_64;
    36. #endif
    37. //霍尔传感器的触发状态
    38. #define GUA_HALL_SENSOR_STATUS_TRIGGER 0 //霍尔传感器触发
    39. #define GUA_HALL_SENSOR_STATUS_IDLE 1 //霍尔传感器没触发
    40. #define GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS 2 //霍尔传感器消抖中
    41. /*********************外部函数声明************************/
    42. GUA_U8 GUA_Hall_Sensor_Check_Pin(void);
    43. void GUA_Hall_Sensor_Init(void);
    44. #endif

    3) 工程中添加GUA_Hall_Sensor.c



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



    2、在应用层中调用

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

    #include "GUA_Hall_Sensor.h"
        

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

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

    3) 添加测试代码

    ①写测试代码main.c中

    
        
    1. static void GUA_Test(void)
    2. {
    3. U8 nGUA_Ret = 0;
    4. U8 nGUA_Stop = 0;
    5. while( 1)
    6. {
    7. //检测霍尔当前状态
    8. nGUA_Ret = GUA_Hall_Sensor_Check_Pin();
    9. //检测到霍尔被触发
    10. if(nGUA_Ret == GUA_HALL_SENSOR_STATUS_TRIGGER)
    11. {
    12. nGUA_Stop = 1;
    13. }
    14. }

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

    
        
    1. //测试代码
    2. GUA_Test();

    七、注意事项

    暂无。


    八、实验结果

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

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


    因此实验成功。




    展开全文
  • I2C我用的例程,器件地址为0x36,角度信息在寄存器0x0c,0x0d 直接上代码 # include "AS5600.H" # include "delay.h" # include "sys.h" void AS5600_Init(void) { IIC_Init(); } u16 AS5600_Read_Len(u8 addr,u8...
  • #资源达人分享计划#
  • JY901B与JY-GPSIMU角度传感器介绍1. 角度传感器简介2. JY901B的IIC通讯协议3. JY-GPSIMU的串口通讯协议三. STM32的IIC与串口读取三轴角度驱动程序1. IIC读取JY901B角度传感器的角度2. UART读取JY-GPSIMU角度传感器...
  • 没有角度。这个也是我今天想和大家说的。最近我做了一个倾角项目。老板基于成本考虑希望我能用MPU6050去算出来角度。说实话自己没接触这个东西,去搞的时候才知道挺难的,很地方看不懂。然后我去看过了正电原子的MPU...
  • 硬件设备:JY62模块、六合一、USB-TTL、杜邦线、STM32F103C8T6单片机。给大家看下图片。 JY62 STM32F103C8T6 2)软件准备 : KEIL 5 (5.17版本的) 链接:https://pan.baidu.com/s/1SEWmixu4jtUL2HH_3Hcn2g ...
  • STM32F030C8T6单片机与GY-61 ADXL335模块测角度 ADXL335 是一款小尺寸、薄型、低功耗、完整的三轴加速度计,提供经过信号调理的电压输出,能以最小±3 g 的满量程范围测量加速度。它可以测量倾斜检测应用中的静态...
  • stm32 ADXL345传感器

    千次阅读 多人点赞 2017-08-25 20:44:39
    0x31—DATA_FORMAT SELF_TEST位:设置为1,自测力应用至传感器,造成输出数据转换。值为0时,禁用自测力 SPI位:值为1,设置器件为3线式SPI模式,值为0,则设置为4线式SPI模式 INT_INVERT位:值为0,设置中断...
  • 该器件采用嵌入式信号处理解决方案来增强ADI公司的 iMEMS®传感器技术,可提供适当格式的工厂校准、传感器数字倾斜角数据,从而利用串行外设接口(SPI)即可方便地访问数据。通过SPI接口可以访问多个测量结果:360°...
  • 角度传感器芯片 mma8451的stm32代码,模块化,非常方便使用
  • STM32+MLX90316霍尔传感器驱动源码 。
  • stm32—火焰传感器的初步使用

    千次阅读 热门讨论 2021-01-14 15:18:29
    目录一、简介二、规格参数:三、连接四、代码 一、简介 可以检测火焰或者波长在 760 纳米~1100 纳米范围内的光源 ...将VCC和GND连接在开发板对应的引脚上(此处选择普中STM32F103开发板),信号输出线接在PC4
  • 基于STM32单片机的使用MPU6050传感器的利用卡尔曼滤波器算法的角度测量仪
  • stm32—霍尔传感器的初步使用

    千次阅读 2021-01-15 19:21:59
    可以检测得出,此外通过它,将许多非电、非磁的物理量例如力、力矩、压力、应力、位置、位移、速度、加速度、角度、角速度、转数、转速以及工作状态发生变化的时间等,也可以通过本传感器转变成电量来进行检测和控制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,683
精华内容 673
关键字:

stm32角度传感器