STM32驱动AS5600磁性旋转位置传感器模块

发布者:幸福的家园最新更新时间:2022-08-08 来源: csdn关键字:STM32 手机看文章 扫描二维码
随时随地手机看文章

简介

AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。 这种非接触式系统测量径向磁化轴上磁铁的绝对角度。 该 AS5600 专为非接触式电位计应用而设计,其坚固的设计消除了任何同质外部杂散磁场的影响。


引脚定义

在这里插入图片描述

I2C接口

7位设备地址为0x36(二进制表示为0110110)

支持标准模式和快速模式和高速模式

写数据

在这里插入图片描述读数据

在这里插入图片描述

从指定的地址开始读数据

在这里插入图片描述

驱动程序

注意: 这里首先搞清楚一件事情,AS5600数据手册中给的7位地址(0x36)指的是原始的7位设备地址,而STM32库中指的设备地址为原始7位设备地址左移一位后得到的设备地址.


cubeMX配置

标准的I2C代码由cubeMX配置生成:

在这里插入图片描述

驱动程序

bsp_as5600.h

#ifndef __BSP_AS5600_H

#define __BSP_AS5600_H


#include "i2c.h"


#define AS5600_I2C_HANDLE hi2c1


#define I2C_TIME_OUT_BASE   10

#define I2C_TIME_OUT_BYTE   1


/*

注意:AS5600的地址0x36是指的是原始7位设备地址,而ST I2C库中的设备地址是指原始设备地址左移一位得到的设备地址

*/


#define AS5600_RAW_ADDR    0x36

#define AS5600_ADDR        (AS5600_RAW_ADDR << 1)

#define AS5600_WRITE_ADDR  (AS5600_RAW_ADDR << 1)

#define AS5600_READ_ADDR   ((AS5600_RAW_ADDR << 1) | 1)



#define AS5600_RESOLUTION 4096 //12bit Resolution 


#define AS5600_RAW_ANGLE_REGISTER  0x0C



void bsp_as5600Init(void);

uint16_t bsp_as5600GetRawAngle(void);

float bsp_as5600GetAngle(void);


#endif /* __BSP_AS5600_H */


bsp_as5600.c

#include "bsp_as5600.h"


#define abs(x) ((x)>0?(x):-(x))

#define _2PI 6.28318530718


static float angle_data_prev; //上次位置

static float full_rotation_offset; //转过的整圈数


void bsp_as5600Init(void) {

  /* init i2c interface */

  

  /* init var */

  full_rotation_offset = 0;

  angle_data_prev = bsp_as5600GetRawAngle();

}


static int i2cWrite(uint8_t dev_addr, uint8_t *pData, uint32_t count) {

  int status;

  int i2c_time_out = I2C_TIME_OUT_BASE + count * I2C_TIME_OUT_BYTE;

  

  status = HAL_I2C_Master_Transmit(&AS5600_I2C_HANDLE, dev_addr, pData, count, i2c_time_out);

  return status;

}


static int i2cRead(uint8_t dev_addr, uint8_t *pData, uint32_t count) {

  int status;

  int i2c_time_out = I2C_TIME_OUT_BASE + count * I2C_TIME_OUT_BYTE;

  

  status = HAL_I2C_Master_Receive(&AS5600_I2C_HANDLE, (dev_addr | 1), pData, count, i2c_time_out);

  return status;

}


uint16_t bsp_as5600GetRawAngle(void) {

  uint16_t raw_angle;

  uint8_t buffer[2] = {0};

  uint8_t raw_angle_register = AS5600_RAW_ANGLE_REGISTER;

  

  i2cWrite(AS5600_ADDR, &raw_angle_register, 1);

  i2cRead(AS5600_ADDR, buffer, 2);

  raw_angle = ((uint16_t)buffer[0] << 8) | (uint16_t)buffer[1];

  return raw_angle;

}


float bsp_as5600GetAngle(void) {

  float angle_data = bsp_as5600GetRawAngle();

  

  float d_angle = angle_data - angle_data_prev;

  if(abs(d_angle) > (0.8 * AS5600_RESOLUTION)) {

    full_rotation_offset += (d_angle > 0 ? -_2PI : _2PI);

  }

  angle_data_prev = angle_data;

  

  return (full_rotation_offset + (angle_data / (float)AS5600_RESOLUTION)*_2PI);

}


测试程序

/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_I2C1_Init();

  /* USER CODE BEGIN 2 */

  bsp_as5600Init();

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

//    uint8_t buffer[2] = {0};

//    uint8_t addr = 0x0c;

//    HAL_I2C_Master_Transmit(&hi2c1, (0x36 << 1), &addr, 1, 10);

//    HAL_I2C_Master_Receive(&hi2c1, (0x36 << 1)|1, buffer, 2, 10);

//    angle_raw = buffer[0] << 8 | buffer[1];

    angle_raw = bsp_as5600GetRawAngle();

    angle = bsp_as5600GetAngle();

    HAL_Delay(100);

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}


参考资料

Arduino FOC 库中AS5600的驱动代码

AS5600 数据手册

关键字:STM32 引用地址:STM32驱动AS5600磁性旋转位置传感器模块

上一篇:STM32CubeMX知识点
下一篇:STM32 HAL+PWM+DMA方式驱动WS2812灯珠波形分析

推荐阅读最新更新时间:2024-11-06 17:09

基于STM32使用超声波HC-SR04模块
写在前面注意的几点: 1、HC-SR04模块必须使用5V供电,不能是3.3V 2、若单是测距,无需使用中断 3、Echo和Trig两个引脚可以任意接可用的GPIO,和定时器无关 说一下超声波的工作原理 单片机给Trig引脚一个最少10us的高电平,然后拉低引脚,便启动了模块, 然后超声波就被发了出去,超声波遇到障碍物后返回被模块接收,Echo引脚会输出一段高电平,高电平的时间与距离成比例; 那么我们所需要做的就是出发Trig引脚,然后测出Echo持续高电平的时间 以下是GPIO的设置: void Ultrasonic_Config(void) { GPIO_InitTypeDef GPIO_InitS
[单片机]
基于<font color='red'>STM32</font>使用超声波HC-SR04<font color='red'>模块</font>
STM32标准库及的Keil软件包下载
在安装好Keil开发工具后,还需要分别安装STM32相关的软件包及相关的函数库。 由于官网一般下载速度较慢,将常用及标准库上传在网盘上,可自行下载。 Keil软件包 链接:https://pan.baidu.com/s/1Uh1J0L9gZSIWKtDzocQWJA 提取码:gdcw STM32标准库 链接:https://pan.baidu.com/s/1NQXKnOTQAr0P3NMqrnI2Ww 提取码: zs99 STM32的软件包属于Keil相关,下载方法如下: 1. 打开链接:https://www.keil.com/dd2/Pack/ 2. 下拉找到所使用的STM32芯片的型号,点击右
[单片机]
<font color='red'>STM32</font>标准库及的Keil软件包下载
基于STM32的EMS液晶显示触摸屏设计方案
0 引 言 电动车一直以清洁环保而备受关注,加上能源危机加剧、油价不断上涨,电动车也越来越受到用户的青睐。电动车一般采用锂电池供电,由多个单体电池串联成电池组作为动力电源。但由于各个串联单体电池特性不能保证完全一致,因此相同的电流下充电放电速度也会不同,如果不进行均衡干预,电池寿命会大大缩短,因此需要实时监控各个单体电池的状态、总电压、总电流,根据状态适时进行电池充放电均衡,并且充放电均衡时,均衡状态也要实时进行检测,所以就有了电动车电池能量管理系统(EMS)。实践证明EMS可以有效延长电动车电池使用寿命,是电动车中十分重要的管理系统。 EMS主要包括:信息采集模块、充放电均衡模块、信息集中处理模块以及显示模块。图1为自主
[单片机]
基于<font color='red'>STM32</font>的EMS液晶显示触摸屏设计方案
基于STM32的光伏直流柜智能检测系统设计
太阳能作为最具潜力的可再生能源,因其储量的无限性、存在的普遍性、利用的清洁性以及实用的经济性,越来越被人们所青睐。大力发展光伏产业、积极开发太阳能,在全球范围得到了空前重视,已成为各国可持续发展战略的重要组成部分。直流配电柜作为光伏电站的重要组成部分,其运行稳定、电气量信息检测准确可靠,是整个系统工作可靠的基础和保障。 本文通过分析直流母线正负极和支路绝缘检测原理,利用STM32控制芯片的特点,设计了一种智能检测系统,结合相应的控制策略,实现直流配电柜电气量信息的实时准确采集,保证系统可靠运行。 1 直流母线正负极和支路绝缘检测原理 1.1 直流母线正负极绝缘检测原理 直流母线的检测方法常用的有平衡电桥法和不平衡电桥法两种
[单片机]
基于<font color='red'>STM32</font>的光伏直流柜智能检测系统设计
对于STM32 GPIO模式不理解造成的问题解释
今天在编写Flash的程序时候,在最后,所有的程序都已经编写完成,经过测试,没有问题。接下来就是整理程序,自己将一些函数封装,可以便于自己以后移植,但是问题就出现在了这儿。 我在封装的过程中,突然发现自己如果将SPI模式初始化函数放置在 CS引脚初始化后面,接下来直接读取 Flash芯片ID的时候使用Jlink读取的数据就不能显示正常,显示数据为0xFFFF,但是,如果我将SPI模式初始化函数放置在 CS引脚初始化前面,整个程序运行是正常的。 真的是百思不得其解,我当时在想,不应该是CS初始化的影响,但是自己真的是没找见问题,最后,就到21IC上面去求助,当时我写完问题之后,接下来做什么? 接着自己找问题呗,还能做什么。 当时我又
[单片机]
STM32存储器 — <2>STM32存储器知识的相关应用
在我的另一篇笔记《stm32的存储器》中讲述了STM32的存储器结构,及个人理解。 本篇文章将重点描述在对存储器有了比较深入了解之后的一些相关的操作案例;重点在于STM32启动设置和IAP使用,以及bit banding的理解,加上一个简单的IAP程序设计。 1 STM32的启动 根据参考手册RM0008中的图表: 得知STM32的启动有三种模式,三种模式的选择在于芯片上的两个Boot引脚,如RM0008种描述: 在系统复位之后的四个上升沿后索存BOOT引脚,从而决定启动方式;用户对BOOT引脚的设置决定了系统复位之后的启动模式。 三个不同的启动区域有着不同的起始地址,STM32这样规定:
[单片机]
STM32入门开发:编写XPT2046电阻触摸屏驱动(模拟SPI)
一、环境介绍 单片机采用: STM32F103ZET6 编程软件: keil5 编程语言: C语言 编程风格: 寄存器开发. 目标芯片: XPT2046---标准SPI接口时序 二、XPT2046芯片介绍 2.1 功能 XPT2046是一颗12位的ADC芯片,可以当做普通的ADC芯片使用,但是一般都是用在电阻触摸屏上,方便定位触摸屏坐标。 图1: XPT2046内部原理图 图2:电阻触摸屏---引出的4条线就接在XPT2046的YNXNYPXP上 (XPT2046支持笔中断输出--低电平有效,这个引脚可以配置到单片机的中断脚上,或者轮询判断这个引脚状态,判断触摸屏是否已经按下) 可以单独买一个触
[单片机]
<font color='red'>STM32</font>入门开发:编写XPT2046电阻触摸屏<font color='red'>驱动</font>(模拟SPI)
STM32独立看门狗IWDG的使用
一、定义 按照STM32参考手册的说法:“独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。” 简单的说,STM32 中的IWDG 其核心就是一个12bits的向下递减的计数器,当计数器计数到零时就会触发系统复位。因此,要在每次计数到零之前将其复位到一个初始值。这个初始值就在重装载寄存器(IWDG_RLR)中存放,其默认值为0xFFF,我们也可以将其改为其他值。 二、初始化 时钟来源: 内部的40KHz的时钟,与系统时
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved