国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

AS5600步進(jìn)電機(jī)編碼器(原理圖+pcb+stm32控制代碼)

這篇具有很好參考價值的文章主要介紹了AS5600步進(jìn)電機(jī)編碼器(原理圖+pcb+stm32控制代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

一、AS5600介紹

AS5600是一個易于編程的磁性旋轉(zhuǎn)位置傳感器,具有高分辨率的12位模擬或PWM輸出。這種非接觸式系統(tǒng)測量一個直徑磁化的軸上磁鐵的絕對角度。
引腳如下圖
as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
他有兩種供電模式:5V和3.3V
as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
我們?yōu)榱撕蛃tm32F103C8T6單片機(jī)的電壓一致,也使用3.3V供電,然后開始畫PCB。

二、pcb設(shè)計

使用嘉立創(chuàng)EDA畫圖
as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm

三、實(shí)物照片

as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
已經(jīng)把a(bǔ)s5600貼到了電機(jī)后面,暫時沒有稍微長一點(diǎn)的螺絲,不然用四個螺絲固定更好。

四、程序代碼

代碼實(shí)現(xiàn)的功能:
1、可以實(shí)時顯示當(dāng)前絕對位置的角度(0~360)
2、可以實(shí)時顯示增量角度,比如正轉(zhuǎn)了2轉(zhuǎn),顯示為720度,又在此基礎(chǔ)上反轉(zhuǎn)了3轉(zhuǎn),顯示為-360度。
3、一上電當(dāng)前位置即可自動設(shè)置為初始零位。
3、也可以測實(shí)時的速度(暫時沒有寫這部分功能,實(shí)現(xiàn)也簡單,兩次位置差除以時間即可)

難點(diǎn):as5600接在了電機(jī)尾部,步進(jìn)電機(jī)的軸轉(zhuǎn)5.18圈,減速器輸出的軸轉(zhuǎn)1圈,as5600直接讀的是步進(jìn)電機(jī)軸的位置(我這個步進(jìn)電機(jī)帶了減速器,減速比為5.18)所以還需要一些轉(zhuǎn)換。

程序大概思路:
設(shè)置3個變量temp0(記錄一上電之后電機(jī)軸的初始位置,在程序中只需運(yùn)行一次即可),temp1(用于記錄本次電機(jī)軸的位置),temp2(用于記錄下一次電機(jī)軸的位置)。temp1和temp2主要用于過360度判斷,即如果temp-temp2>180度(在很短的時間內(nèi)),那么肯定是過了360度了,即下一轉(zhuǎn)開始了,因?yàn)殡姍C(jī)不可能在很短的時間轉(zhuǎn)過這么多度。而且從程序初始化以后就要一直拿比較temp1和temp2,每次都不能少,比較完了就把temp2賦值給temp1,然后下次再獲取最新的temp2以后,繼續(xù)和temp1比較。就是要一直和上一次的數(shù)據(jù)比較,中間不能又一次斷開,這樣可以保證不漏過那個變化的點(diǎn),每次過360度的時候,進(jìn)行一個計數(shù)(程序中用過零點(diǎn)標(biāo)記sign_angle計數(shù)),然后只要知道初始角度(temp0)、過零點(diǎn)的次數(shù)(sign_angle),以及當(dāng)前點(diǎn)的角度(temp2),就可以算出角度增量。
程序代碼如下:

下面是as5600.h文件

#ifndef __AS5600__
#define __AS5600__
#include "sys.h"
#include "stm32f10x.h"

#define Slave_Addr                0x36 //設(shè)備從地址
#define Write_Bit                 0	   //寫標(biāo)記	
#define Read_Bit                  1    //讀標(biāo)記
#define Angle_Hight_Register_Addr 0x0C //寄存器高位地址
#define Angle_Low_Register_Addr   0x0D //寄存器低位地址
#define Jian_Su_Bi                5.18 //步進(jìn)電機(jī)減速比

void AS5600_Init ( void );  //初始化
u16 AS5600_Read_Len ( u8 addr, u8 reg, u8 len, u8 *buf );//從AS5600讀取一次數(shù)據(jù)
void Get_Ini_Val(void); //得到上電后角度初始值
void Get_Temp_Add(void); //等到角度增量(原始值表示的)
void Change_angle(void); //將原始增量數(shù)據(jù)轉(zhuǎn)化為角度
void Get_Num_sign(void); //用于過零點(diǎn)計數(shù)

下面是as5600.c文件

#include "as5600.h"
#include "i2c.h"
#include "delay.h"


u32 angle_ini = 0; 		   //初始角度值
u32 temp0 = 0;			   //初始角度原始輸出值
u32 temp1 = 0;		       //上次角度原始輸出值
u32 temp2 = 0;		       //這次角度原始輸出值
u32 temp_add = 0;	       //從初始角度開始的累計角度原始值
u8  buf[2] = {0};	       //用于oled顯示存放變量,和本程序關(guān)系不大
int sign_angle = 0;	       //過零點(diǎn)標(biāo)記(即從0度轉(zhuǎn)到360度之后繼續(xù)轉(zhuǎn)又回零的那個點(diǎn),正向經(jīng)過一次加一,反向經(jīng)過一次減一)
double True_Angle = 0.0;   //真實(shí)角度(累計角度)
int dir = 0; //0正向 1反向  //方向 
double Current_Angle = 0;   //當(dāng)前角度(就是絕對位置角度,小于360度)
	
void AS5600_Init ( void ) {
    IIC_Init();
}

u16 AS5600_Read_Len ( u8 addr, u8 reg, u8 len, u8 *buf ) {
    IIC_Start();
    IIC_Send_Byte ( ( addr << 1 ) | Write_Bit );

    if ( IIC_Wait_Ack() ) {
        IIC_Stop();
        return 1;
    }

    IIC_Send_Byte ( reg );
    IIC_Wait_Ack();
    IIC_Start();
    IIC_Send_Byte ( ( addr << 1 ) | Read_Bit ); // 發(fā)送器件地址 + 讀命令
    IIC_Wait_Ack(); // 等待應(yīng)答

    while ( len ) {
        if ( len == 1 ) {
            *buf = IIC_Read_Byte ( 0 ); // 讀數(shù)據(jù),發(fā)送nACK
        } else {
            *buf = IIC_Read_Byte ( 1 ) & 0x000f; // 讀數(shù)據(jù),發(fā)送ACK 原始1f,改為0f
        }

        len--;
        buf++;
    }

    IIC_Stop();
    return 0;
}

void Get_Ini_Val(void)//獲得初始角度
{
	u8 i = 0;
	u32 transfer = 0;
	for ( i = 0; i < 20; i++ ) { // 剛開始數(shù)據(jù)可能不穩(wěn)定,直接丟掉
		AS5600_Read_Len ( Slave_Addr, Angle_Hight_Register_Addr, 2, buf );
		delay_ms ( 5 );
    }
	for ( i = 0; i < 20; i++ ) { // 軟件濾波
		AS5600_Read_Len ( Slave_Addr, Angle_Hight_Register_Addr, 2, buf );
		transfer += ( ( buf[0] << 8 ) | buf[1] );
		delay_ms ( 5 );
    }
	temp0 = transfer / 20;
	temp2 = temp0;//給temp2初始化為初始值
	temp1 = temp0;//給temp1初始化為初始值
}


void Get_Temp_Add(void)//計算角度增量
{
	
	if(sign_angle == 0)  //當(dāng)從沒經(jīng)過零點(diǎn)時
	{
		if(temp2 >= temp0) //正轉(zhuǎn)
		{	temp_add = temp2 - temp0;	
			dir = 0;}
		else    			//反轉(zhuǎn)
		{	temp_add = temp0 - temp2;
			dir = 1;}
	}
	else if(sign_angle > 0)//經(jīng)過一次及以上零點(diǎn)位置后,分兩種情況,正向經(jīng)過與反向經(jīng)過,需分開討論
	{

		temp_add = 4096 + temp2 - temp0 + ( sign_angle - 1)*4096;  //正向經(jīng)過
		dir = 0;
	}
	else 
	{
		temp_add =4096 + temp0 - 4096*(sign_angle+1) - temp2;   //反向經(jīng)過
		dir = 1;
	}
}

void Change_angle(void)//考慮減速比,計算增量實(shí)際角度
{
	True_Angle = (temp_add/(Jian_Su_Bi*4096))*360;  //4096代表as5600原始數(shù)據(jù)最大值(0~4096)
}

void Get_Current_angle(void)//獲取360度角度,即計算絕對位置,小于等于360度
{
	u32 x0 = 0;
	x0 = (temp_add*100)%((u32)(Jian_Su_Bi*100)*4096);
	Current_Angle = (x0/(Jian_Su_Bi*4096))*360/100;
}

void Get_Num_sign(void) //計算過零點(diǎn)次數(shù),這個函數(shù)也可以用定時器中斷來調(diào)用,效果更好
{
	u32 x;
	AS5600_Read_Len ( Slave_Addr, Angle_Hight_Register_Addr, 2, buf );
	temp2 = ( ( buf[0] << 8 ) | buf[1] );
	if(temp1 >= temp2)
	{
		x = temp1 - temp2;
		if(x>2048)//正轉(zhuǎn)通過零點(diǎn)
		{
			sign_angle++;
		}
	}
	else
	{
		x = temp2 -temp1;
		if(x>2048)//反轉(zhuǎn)通過零點(diǎn)
		{
			sign_angle--;
		}
	}
	temp1 = temp2;//每次都把temp2賦給temp1
}



下面是main函數(shù)

#include "stm32f10x.h"
#include "oled.h"
#include "delay.h"
#include "timer.h"
#include "key.h"
#include "exti.h"
#include "as5600.h"
#include "stdio.h"
#include "sys.h"
#include "key.h"
#include "mtor.h"
#include "exti.h"
#include "oledfont.h"

extern u8  TIM2_Pulse_TIM3_Counter_OK;

uint16_t pwm = 7199;
u32 pulsecnt = 200;
extern double Current_Angle;
extern double True_Angle;
extern int dir;
extern u32 temp_add;
extern u32 temp2;
extern u32 temp0;
uint8_t sign = 0;
extern int sign_angle;
 int main(void)
 {		 
	 char strff[21];
	 char strff2[21];
     static uint8_t x = 1;

     delay_init();
     OLED_Init();
     led_Init();
     KEY_Init();
  
  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
    TIM3_PWM_Init(pwm,19);//控制頻率 72000000/(7199+1)/(19+1)=500HZ
	TIM_SetCompare2(TIM3,10);//控制占空比,原始49,改為2999
    motor_init();
    TIM2_Init(pulsecnt);
    EXTIX_Init();
    AS5600_Init();
    memset(strff,0,sizeof(strff));
	memset(strff2,0,sizeof(strff2));
	Get_Ini_Val();//獲得初始角度
	
  while(1)
  {
	Get_Temp_Add();
	Change_angle();
	Get_Current_angle();
	Get_Num_sign();
	sprintf(strff,"%.2f",True_Angle);//%0.2f  angle
	//sprintf(strff2,"%.2f",Current_Angle);//%0.2f  angle
	sprintf(strff2,"%.2f",Current_Angle); 
	  if(dir == 0)
	  {
		OLED_ShowChar(0,0,'+');
		OLED_ShowChar(0,4,'+');
	  }
	  else
	  {
		OLED_ShowChar(0,0,'-');
		OLED_ShowChar(0,4,'-');
	  }
	  
	OLED_ShowNum(6,0,True_Angle,5,12);
	OLED_ShowString(0,2,strff);
	OLED_ShowNum(6,4,Current_Angle,5,12);
	OLED_ShowString(0,6,strff2);  
	//OLED_ShowNum(54,6,3600000/pwm,5,12);
	  
	Get_Num_sign();
	
		switch(sign)
		{
			case 1:
				if(x==1)
				{/*TIM_Cmd(TIM3,ENABLE);
					led_On_Off();
					x++;*/
					setDir();
					x++;	
				}
				else if(x==2)
				{
					/*setDir();
					x++;*/	
					TIM_Cmd(TIM3,ENABLE);
					led_On_Off();
					x++;					
				}
				else if(x==3)
				{	TIM_Cmd(TIM3,DISABLE);
					led_On_Off();
					x=1;}
				sign = 0;
				break;
			case 2:
				if(pwm>0)
				{
					pwm-=100;
				}else
				{
					pwm=7199;
				}
				sign = 0;
				TIM_SetAutoreload(TIM3,pwm);
				break;
				
			case 3:
			
			if(pwm<15000)
				{
					pwm+=100;
				}else
				{
					pwm=7199;
				}
				sign = 0;
				TIM_SetAutoreload(TIM3,pwm);
				break;
			case 4:
				//正轉(zhuǎn)1/4,反轉(zhuǎn)1/4,正轉(zhuǎn)半圈,反轉(zhuǎn)半圈
			Pulse_output(1036);
			
			/*setDir();
			
			Pulse_output(1036);
			while(TIM2_Pulse_TIM3_Counter_OK!=1);
			TIM2_Pulse_TIM3_Counter_OK=0;*/
			
			//setDir();
			
			/*Pulse_output(100);
			while(TIM2_Pulse_TIM3_Counter_OK!=1);
			TIM2_Pulse_TIM3_Counter_OK=0;
			
			setDir();
			
			Pulse_output(100);
			while(TIM2_Pulse_TIM3_Counter_OK!=1);
			TIM2_Pulse_TIM3_Counter_OK=0;
			
			*/
			
			sign = 0;
			break;	
			
			default:
				break;
		}	
		if(TIM2_Pulse_TIM3_Counter_OK==1)
		{
				TIM2_Pulse_TIM3_Counter_OK=0;
		}
		
	}
	
 }

注意switch后面的語句是用來按鈕控制步進(jìn)電機(jī)運(yùn)動的,和as5600本身無關(guān)。

五、實(shí)物演示

as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
圖中一個是基于STM32F103C8T6的控制器,一個是TB6600步進(jìn)電機(jī)驅(qū)動板。
實(shí)測,代碼正常運(yùn)行,功能都可以實(shí)現(xiàn),連續(xù)正轉(zhuǎn)10圈誤差在3.6度以內(nèi),再反轉(zhuǎn)10圈回零點(diǎn)誤差在0.15度以內(nèi),數(shù)據(jù)也基本穩(wěn)定。
測試數(shù)據(jù)記錄
as5600,硬件設(shè)計,stm32單片機(jī),stm32,單片機(jī),arm
測試的時候每次給半圈的脈沖,所以一轉(zhuǎn)是兩個數(shù)據(jù),0->180.21->0.103->180.63->0.239…依次測量得到。

最后,附上程序代碼以及AS5600的berger制板文件的下載地址
鏈接:https://pan.baidu.com/s/1zxl2O3oEvmDIDNtbDGoTPg
提取碼:m5k5
演示效果觀看地址:
https://www.bilibili.com/video/BV1hP411N7PJ/?vd_source=81fb9332eb85b94d92d4e3884ff48c6a文章來源地址http://www.zghlxwxcb.cn/news/detail-780472.html

到了這里,關(guān)于AS5600步進(jìn)電機(jī)編碼器(原理圖+pcb+stm32控制代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • HAL STM32 硬件I2C方式讀取AS5600磁編碼器獲取角度例程

    HAL STM32 硬件I2C方式讀取AS5600磁編碼器獲取角度例程

    ??相關(guān)篇《STM32 軟件I2C方式讀取AS5600磁編碼器獲取角度例程》 ?stm32使用硬件I2C去讀取角度數(shù)據(jù),通過STM32CubeMX工具配置工程,讀取角度數(shù)據(jù),只需要調(diào)用一個函數(shù),即可完成數(shù)據(jù)的讀取。了解函數(shù)的用法以及從設(shè)備地址命令,上手十分快速和簡單。 ??AS5600資料: https://p

    2024年04月26日
    瀏覽(51)
  • MT6701磁編碼器使用指南,14Bit單圈絕對值,I2C stm32 HAL庫讀角度,兼容AS5600

    MT6701磁編碼器使用指南,14Bit單圈絕對值,I2C stm32 HAL庫讀角度,兼容AS5600

    ??MT6701是麥歌恩(MagnTek)公司的磁性角度傳感器芯片,提供14Bit 0~360°單圈絕對角度檢測,擁有 ABZ/PWM/模擬量/I2C/SSI 等多種信息輸出方式,還可根據(jù)磁場強(qiáng)度的瞬時變化提供非接觸式按壓檢測功能。能夠以較低的成本來替代傳統(tǒng)光電編碼器,可應(yīng)用于絕對值角度輸出、閉環(huán)

    2024年02月02日
    瀏覽(25)
  • stm32霍爾編碼器電機(jī)測速原理

    ????????本次選用的編碼器電機(jī)為13線的霍爾編碼器電機(jī),電機(jī)減速比為30:1,轉(zhuǎn)動一圈輸出13*30=390個脈沖。輪胎直徑為75mm,輪胎周長為pi*d=3*75=225mm.定時器采用四倍頻計數(shù),則一圈輸出390*4=1560個脈沖。具體編碼器知識這里就不多說了。 ?????????根據(jù)測速原理:假設(shè)編

    2024年02月15日
    瀏覽(33)
  • 【程序】【必須】編碼器電機(jī)測速,原理+代碼+濾波

    【程序】【必須】編碼器電機(jī)測速,原理+代碼+濾波

    參考資料: https://blog.csdn.net/lzzzzzzm/article/details/119416134 野火STM32電機(jī)開發(fā)教程 常見的編碼器有兩種,分別為霍爾編碼器和GMR編碼器。 1.1 霍爾編碼器 ? 霍爾編碼器圓盤上分布有磁極,當(dāng)圓盤隨電機(jī)主軸轉(zhuǎn)動時,會輸出兩路相位差90°的方波,用這兩路方波可測出電機(jī)的轉(zhuǎn)速和

    2023年04月23日
    瀏覽(18)
  • 步進(jìn)電機(jī)結(jié)構(gòu)及原理

    步進(jìn)電機(jī)結(jié)構(gòu)及原理

    步進(jìn)電機(jī)是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件。通過控制施加在電機(jī)線圈上的電脈沖順序、 頻率和數(shù)量, 可以實(shí)現(xiàn)對步進(jìn)電機(jī)的轉(zhuǎn)向、 速度和旋轉(zhuǎn)角度的控制。在不借助帶位置感應(yīng)的閉環(huán)反饋控制系統(tǒng)的情況下、 使用步進(jìn)電機(jī)與其配套的驅(qū)動器共同組成的

    2023年04月21日
    瀏覽(24)
  • 步進(jìn)電機(jī)工作原理

    步進(jìn)電機(jī)工作原理

    什么是步進(jìn)電機(jī) ? 步進(jìn)電機(jī)是將電脈沖信號,轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制電機(jī),又稱為脈沖電機(jī)。在非超載的情況下,電機(jī)的轉(zhuǎn)速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負(fù)載變化的影響。當(dāng)步進(jìn)驅(qū)動器接收到一個脈沖信號時,它就可以驅(qū)動步進(jìn)電機(jī)

    2024年02月06日
    瀏覽(23)
  • 霍爾編碼器電機(jī)與TB6612電機(jī)驅(qū)動相關(guān)學(xué)習(xí)

    霍爾編碼器電機(jī)與TB6612電機(jī)驅(qū)動相關(guān)學(xué)習(xí)

    簡單粗暴的說下,電機(jī)-電機(jī)驅(qū)動-單片機(jī)該怎么連線。 先簡單認(rèn)識一下霍爾編碼器電機(jī) 以上選用的平衡小車之家的,市面上基本都跟這個差不了多少。 電機(jī)線-+這兩個引腳 與電機(jī)驅(qū)動相連接 來控制電機(jī)的正反轉(zhuǎn)(自己的淺顯理解) ?編碼器的AB相 連接單片機(jī)(定時器)? 編

    2023年04月09日
    瀏覽(22)
  • 【基礎(chǔ)知識】【模塊介紹】電機(jī)編碼器

    【基礎(chǔ)知識】【模塊介紹】電機(jī)編碼器

    目錄 概述 ?測速原理 波形分析 解碼 單相計數(shù) A相 B相 雙相計數(shù) 轉(zhuǎn)速計算 電機(jī)編碼器常見的是AB相電機(jī)編碼器,和旋轉(zhuǎn)編碼器類似,傳送門 常見的有光電和霍爾等,屬于非接觸測轉(zhuǎn)速的方法 不管是光電還是霍爾的編碼器本質(zhì)上都是在電機(jī)的旋轉(zhuǎn)軸上放上一個碼盤, 不同的是

    2023年04月08日
    瀏覽(25)
  • 步進(jìn)電機(jī)原理及參數(shù)詳解

    步進(jìn)電機(jī)原理及參數(shù)詳解

    步進(jìn)電機(jī)常見型號:20,28,35,39,42,57,86等,功能大同小異,差異主要點(diǎn)在尺寸和輸出力的大小不一樣。下面我們以57為例詳細(xì)說明其原理。 步進(jìn)電機(jī)常見和用到最多的是2相步進(jìn)電機(jī),也有3,5相等,用量較少,驅(qū)動器價格昂貴,一般一些特殊場景才會使用。 1. 為什么叫20,28,35,39

    2024年02月04日
    瀏覽(27)
  • stm32編碼器電機(jī)測速(hal庫)

    stm32編碼器電機(jī)測速(hal庫)

    記錄一下今天參考別人的代碼實(shí)現(xiàn)了四個電機(jī)的測速。 ? 編碼器被廣泛應(yīng)用于電機(jī)測速,實(shí)現(xiàn)電機(jī)閉環(huán)控制 。所以不論是自己做小車還是后續(xù)參加各種比賽,必須要學(xué)會編碼器測速。 ????????編碼電機(jī)其實(shí)就是一個帶有編碼器的電機(jī),我的這個電機(jī)是一個帶霍爾傳感器的

    2024年02月13日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包