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

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

這篇具有很好參考價值的文章主要介紹了stm32編碼器電機測速(hal庫)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

記錄一下今天參考別人的代碼實現(xiàn)了四個電機的測速。

?

編碼器被廣泛應用于電機測速,實現(xiàn)電機閉環(huán)控制。所以不論是自己做小車還是后續(xù)參加各種比賽,必須要學會編碼器測速。

一.參數(shù)? ? ?

????????編碼電機其實就是一個帶有編碼器的電機,我的這個電機是一個帶霍爾傳感器的電機,型號是JGB37-520,然后我的電機減速比是30(一定要記住,買的時候也要看清電機減速比是多少,涉及到轉速的計算),額定電壓12V,然后就是編碼器的參數(shù)了,見下圖

stm32cube編碼器測速,HAL庫小車制作之路,stm32,單片機,嵌入式硬件

stm32cube編碼器測速,HAL庫小車制作之路,stm32,單片機,嵌入式硬件

電機驅動模塊我用的TB6612的四路的板子,就是下面這款,很好用,就是稍微有點貴。

stm32cube編碼器測速,HAL庫小車制作之路,stm32,單片機,嵌入式硬件

二.常用測速方法

主要分為M法、T法和M/T法,詳情見這篇文章STM32 CubeMax 編碼器電機測速 原理與實現(xiàn)

?三.CubeMX配置

首先是配置PWM輸出定時器,我這里使用的是TIM8

stm32cube編碼器測速,HAL庫小車制作之路,stm32,單片機,嵌入式硬件

然后再配置編碼器輸入定時器TIM2,TIM3\TIM4\TIM5按照相同的參數(shù)配置

stm32cube編碼器測速,HAL庫小車制作之路,stm32,單片機,嵌入式硬件

這里開啟了兩個通道計數(shù),就是倍頻技術的4倍頻

編碼器模式下的定時器其實是個計數(shù)器,在編碼器的脈沖到來時,Counter會相應地加和減,正轉時加,反轉時減,溢出后到達另一個極端值,比如說向上計數(shù)到達20001時會變成0

再設置每隔10ms讀取定時器的值的定時器TIM6

stm32cube編碼器測速,HAL庫小車制作之路,stm32,單片機,嵌入式硬件

?最后注意中斷優(yōu)先級TIM6要小于編碼器計數(shù)的定時器。

stm32cube編碼器測速,HAL庫小車制作之路,stm32,單片機,嵌入式硬件

?四.代碼

?encoder.c

#include "encoder.h"

Motor motor1;
Motor motor2;
Motor motor3;
Motor motor4;
int t1,t2,t3,t4,j1,j2,j3,j4;

void Motor_Init(void)
{
    HAL_TIM_Encoder_Start(&ENCODER_TIM1, TIM_CHANNEL_ALL);      //開啟編碼器定時器
		HAL_TIM_Encoder_Start(&ENCODER_TIM2, TIM_CHANNEL_ALL); 
		HAL_TIM_Encoder_Start(&ENCODER_TIM3, TIM_CHANNEL_ALL); 
		HAL_TIM_Encoder_Start(&ENCODER_TIM4, TIM_CHANNEL_ALL); 
		
    __HAL_TIM_ENABLE_IT(&ENCODER_TIM1,TIM_IT_UPDATE);           //開啟編碼器定時器更新中斷,防溢出處理
		__HAL_TIM_ENABLE_IT(&ENCODER_TIM2,TIM_IT_UPDATE); 
		__HAL_TIM_ENABLE_IT(&ENCODER_TIM3,TIM_IT_UPDATE); 
		__HAL_TIM_ENABLE_IT(&ENCODER_TIM4,TIM_IT_UPDATE); 
	
    HAL_TIM_Base_Start_IT(&GAP_TIM);                       //開啟10ms定時器中斷
    __HAL_TIM_SET_COUNTER(&ENCODER_TIM1, 10000);                //編碼器定時器初始值設定為10000
		__HAL_TIM_SET_COUNTER(&ENCODER_TIM2, 10000);
		__HAL_TIM_SET_COUNTER(&ENCODER_TIM3, 10000);
		__HAL_TIM_SET_COUNTER(&ENCODER_TIM4, 10000);
	
	
    motor1.lastCount = 0;                                   //結構體內容初始化
    motor1.totalCount = 0;
    motor1.overflowNum = 0;                                  
    motor1.speed = 0;
    motor1.direct = 0;
	
		motor2.lastCount = 0;                                   //結構體內容初始化
    motor2.totalCount = 0;
    motor2.overflowNum = 0;                                  
    motor2.speed = 0;
    motor2.direct = 0;
		
		motor3.lastCount = 0;                                   //結構體內容初始化
    motor3.totalCount = 0;
    motor3.overflowNum = 0;                                  
    motor3.speed = 0;
    motor3.direct = 0;
		
		motor4.lastCount = 0;                                   //結構體內容初始化
    motor4.totalCount = 0;
    motor4.overflowNum = 0;                                  
    motor4.speed = 0;
    motor4.direct = 0;
}
//M法測速度
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定時器回調函數(shù),用于計算速度
{
    if(htim->Instance==ENCODER_TIM1.Instance)//編碼器輸入定時器溢出中斷                    
    {      
        if(COUNTERNUM1 < 10000) motor1.overflowNum++;       //如果是向上溢出
        else if(COUNTERNUM1 >= 10000) motor1.overflowNum--; //如果是向下溢出
        __HAL_TIM_SetCounter(&ENCODER_TIM1, 10000);             //重新設定初始值
			
			if(COUNTERNUM2 < 10000) motor2.overflowNum++;       //如果是向上溢出
        else if(COUNTERNUM2 >= 10000) motor2.overflowNum--; //如果是向下溢出
        __HAL_TIM_SetCounter(&ENCODER_TIM2, 10000);             //重新設定初始值
			
			if(COUNTERNUM3 < 10000) motor3.overflowNum++;       //如果是向上溢出
        else if(COUNTERNUM3 >= 10000) motor3.overflowNum--; //如果是向下溢出
        __HAL_TIM_SetCounter(&ENCODER_TIM3, 10000);             //重新設定初始值
			
			 if(COUNTERNUM4 < 10000) motor4.overflowNum++;       //如果是向上溢出
        else if(COUNTERNUM4 >= 10000) motor4.overflowNum--; //如果是向下溢出
        __HAL_TIM_SetCounter(&ENCODER_TIM4, 10000);             //重新設定初始值
    }
    else if(htim->Instance==GAP_TIM.Instance)//間隔定時器中斷,是時候計算速度了
    {
        motor1.direct = __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM1);//如果向上計數(shù)(正轉),返回值為0,否則返回值為1
        motor1.totalCount = COUNTERNUM1 + motor1.overflowNum * RELOADVALUE1;//一個周期內的總計數(shù)值等于目前計數(shù)值加上溢出的計數(shù)值
        motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10;//算得每秒多少轉
			if(motor1.direct==0)
			{
				t1=motor1.speed/1;
				j1=(motor1.speed-t1)*10000;
			}
			else
			{
				t1=-motor1.speed/1;
				j1=-(motor1.speed+t1)*10000;
			}
				
				 //motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10 * LINE_SPEED_C//算得車輪線速度每秒多少毫米
        motor1.lastCount = motor1.totalCount; //記錄這一次的計數(shù)值	
				
				motor2.direct = __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM2);//如果向上計數(shù)(正轉),返回值為0,否則返回值為1
        motor2.totalCount = COUNTERNUM2 + motor1.overflowNum * RELOADVALUE2;//一個周期內的總計數(shù)值等于目前計數(shù)值加上溢出的計數(shù)值
        motor2.speed = (float)(motor2.totalCount - motor2.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10;//算得每秒多少轉
			if(motor2.direct==0)
			{
				t2=motor2.speed/1;
				j2=(motor2.speed-t2)*10000;
			}
			else
			{
				t2=-motor2.speed/1;
				j2=-(motor2.speed+t2)*10000;
			}
        //motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10 * LINE_SPEED_C//算得車輪線速度每秒多少毫米
        motor2.lastCount = motor2.totalCount; //記錄這一次的計數(shù)值
				
				motor3.direct = __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM3);//如果向上計數(shù)(正轉),返回值為0,否則返回值為1
        motor3.totalCount = COUNTERNUM3 + motor3.overflowNum * RELOADVALUE3;//一個周期內的總計數(shù)值等于目前計數(shù)值加上溢出的計數(shù)值
        motor3.speed = (float)(motor3.totalCount - motor3.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10;//算得每秒多少轉
			if(motor3.direct==0)
			{
				t3=motor3.speed/1;
				j3=(motor3.speed-t3)*10000;
			}
			else
			{
				t3=-motor3.speed/1;
				j3=-(motor3.speed+t3)*10000;
			}
        //motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10 * LINE_SPEED_C//算得車輪線速度每秒多少毫米
        motor3.lastCount = motor3.totalCount; //記錄這一次的計數(shù)值
				
				motor4.direct = __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM4);//如果向上計數(shù)(正轉),返回值為0,否則返回值為1
        motor4.totalCount = COUNTERNUM4 + motor4.overflowNum * RELOADVALUE4;//一個周期內的總計數(shù)值等于目前計數(shù)值加上溢出的計數(shù)值
        motor4.speed = (float)(motor4.totalCount - motor4.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10;//算得每秒多少轉
			if(motor4.direct==0)
			{
				t4=motor4.speed/1;
				j4=(motor4.speed-t4)*10000;
			}
			else
			{
				t4=-motor4.speed/1;
				j4=-(motor4.speed+t4)*10000;
			}
        //motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10 * LINE_SPEED_C//算得車輪線速度每秒多少毫米
        motor4.lastCount = motor4.totalCount; //記錄這一次的計數(shù)值
			}      
}			

??encoder.h

#ifndef _ENCODER_H_
#define _ENCODER_H_

#include "stm32f1xx.h"
#include "tim.h"
  
 
//定時器號
#define ENCODER_TIM1 htim2
#define ENCODER_TIM2 htim3
#define ENCODER_TIM3 htim4
#define ENCODER_TIM4 htim5

#define GAP_TIM     htim6
  
#define MOTOR_SPEED_RERATIO 30u    //電機減速比
#define PULSE_PRE_ROUND 11 //一圈多少個脈沖
#define RADIUS_OF_TYRE 40 //輪胎半徑,單位毫米
#define LINE_SPEED_C RADIUS_OF_TYRE * 2 * 3.14

#define RELOADVALUE1 __HAL_TIM_GetAutoreload(&ENCODER_TIM1)    //獲取自動裝載值,本例中為20000
#define COUNTERNUM1 __HAL_TIM_GetCounter(&ENCODER_TIM1)        //獲取編碼器定時器中的計數(shù)值

#define RELOADVALUE2 __HAL_TIM_GetAutoreload(&ENCODER_TIM2)
#define COUNTERNUM2 __HAL_TIM_GetCounter(&ENCODER_TIM2) 

#define RELOADVALUE3 __HAL_TIM_GetAutoreload(&ENCODER_TIM3)
#define COUNTERNUM3 __HAL_TIM_GetCounter(&ENCODER_TIM3) 

#define RELOADVALUE4 __HAL_TIM_GetAutoreload(&ENCODER_TIM4)
#define COUNTERNUM4 __HAL_TIM_GetCounter(&ENCODER_TIM4) 

typedef struct _Motor
{
    int32_t lastCount;   //上一次計數(shù)值
    int32_t totalCount;  //總計數(shù)值
    int16_t overflowNum; //溢出次數(shù)
    float speed;         //電機轉速
    uint8_t direct;      //旋轉方向
}Motor;
extern int t1,t2,t3,t4,j1,j2,j3,j4;
void Motor_Init(void);
void HAL_TIM_PeriodElapsedCallback1(TIM_HandleTypeDef *htim);
  
#endif

main.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "bluetooth.h"
#include "Control.h"
#include "oled.h"
#include "encoder.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @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_TIM8_Init();
  MX_USART1_UART_Init();
  MX_I2C2_Init();
  MX_TIM2_Init();
  MX_TIM6_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
  MX_TIM5_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1);
  /* USER CODE END 2 */
	OLED_Init();
	OLED_CLS();
	OLED_ShowChar(14,1,'.',15);
	OLED_ShowChar(14,2,'.',15);
	OLED_ShowChar(14,3,'.',15);
	OLED_ShowChar(14,4,'.',15);
	OLED_ShowStr(50,5,"By Whelve",2);
	OLED_ShowStr(60,1,"r/s",1);
	OLED_ShowStr(60,2,"r/s",1);
	OLED_ShowStr(60,3,"r/s",1);
	OLED_ShowStr(60,4,"r/s",1);
	Motor_Init();
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		Control();
		OLED_ShowNum(0,1,t1,2,15);
		OLED_ShowNum(18,1,j1,5,15);
		
		OLED_ShowNum(0,2,t2,2,15);
		OLED_ShowNum(18,2,j2,5,15);
		
		OLED_ShowNum(0,3,t3,2,15);
		OLED_ShowNum(18,3,j3,5,15);
		
		OLED_ShowNum(0,4,t4,2,15);
		OLED_ShowNum(18,4,j4,5,15);
		
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

?代碼部分參考自STM32 CubeMax 編碼器電機測速 原理與實現(xiàn)

?stm32cube編碼器測速,HAL庫小車制作之路,stm32,單片機,嵌入式硬件

最后效果不錯?文章來源地址http://www.zghlxwxcb.cn/news/detail-539328.html

到了這里,關于stm32編碼器電機測速(hal庫)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • stm32霍爾編碼器電機測速原理

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

    2024年02月15日
    瀏覽(34)
  • STM32之增量式編碼器電機測速

    STM32之增量式編碼器電機測速

    編碼器,是一種用來測量機械旋轉或位移的傳感器。它能夠測量機械部件在旋轉或直線運動時的位移位置或速度等信息,并將其轉換成一系列電信號。 . 按監(jiān)測原理分類 光電編碼器 光電編碼器,是一種通過光電轉換將輸出軸上的機械幾何位移量轉換成脈沖或數(shù)字量的傳感器

    2024年02月13日
    瀏覽(23)
  • Stm32-使用TB6612驅動電機及編碼器測速

    Stm32-使用TB6612驅動電機及編碼器測速

    最近在 學習編碼電機以及嘗試使用編碼電機測速 。遇到了很多問題,花費了很多時間,在這里做一個記錄,對自己學習到的知識進行一個總結 找了很多資料,看了很多視頻,這些太多了,以至于讓我不知道究竟哪一個是正確的,今天看這個,明天看這個,導致自己的學習效

    2023年04月16日
    瀏覽(30)
  • STM32 HAL庫 AS5600編碼器程序

    STM32 HAL庫 AS5600編碼器程序

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 STM32 HAL庫 AS5600編碼器程序 提示:這里可以添加本文要記錄的大概內容: AS5600磁性旋轉位置編碼器是一款可編程、12位高分辨率、非接觸式的設備,具有卓越的可靠性和耐久性。這個旋轉位置傳感器提供

    2024年02月20日
    瀏覽(33)
  • stm32 HAL庫 4096線ABZ編碼器

    stm32 HAL庫 4096線ABZ編碼器

    @[TOC]目錄 買的是這個 AB相代表計數(shù)方向,Z代表過零點 也可以選上DMA 中斷 找一個空閑管腳 打開對應中斷 用DMA 過機械零點就+/-360

    2024年04月17日
    瀏覽(25)
  • 【STM32】HAL庫自學記錄-旋轉編碼器的使用

    【STM32】HAL庫自學記錄-旋轉編碼器的使用

    通過本文可學會兩種實現(xiàn)判斷旋轉編碼器正轉反轉的方法,可根據(jù)自己的應用場景來選擇使用哪種方法。 1、芯片:STM32F103RCT6 2、STM32CubeMx軟件 3、IDE: MDK-Keil軟件 4、旋轉編碼器模塊 5、XCOM V1.4串口軟件 圖中C端為GND。 方向 :A相和B相相差一個相位,一般來說是90°。A相信號在

    2024年02月11日
    瀏覽(29)
  • HAL STM32 硬件I2C方式讀取AS5600磁編碼器獲取角度例程

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

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

    2024年04月26日
    瀏覽(51)
  • 【32單片機學習】(3)霍爾編碼器減速直流電機控制及測速

    【32單片機學習】(3)霍爾編碼器減速直流電機控制及測速

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 目錄 前言 1.實驗現(xiàn)象 2.實驗接線及原理圖 接線圖 原理圖? 電機接線圖 3.代碼部分 1.主函數(shù)? main.c 2.按鍵部分? ?key.c ?key.h pwm代碼? ?pwm.c ?pwm.h 電機驅動? ?motor.c? ?motor.h ?OLED顯示 oled.c oled.h? 編碼器

    2024年02月11日
    瀏覽(36)
  • stm32-編碼器測速

    stm32-編碼器測速

    編碼電機 旋轉編碼器 A,B相分別接通道一和二的引腳,VCC,GND接單片機VCC,GND 以前的代碼是通過觸發(fā)外部中斷,然后在中斷函數(shù)里手動進行計次。使用編碼器接口的好處就是節(jié)約軟件資源。對于頻繁執(zhí)行,操作簡單的任務,一般設計一個硬件電路模塊來自動完成。 使用定時器

    2024年03月19日
    瀏覽(27)
  • STM32(HAL)--使用定時器TIM的Encoder Mode來讀取旋鈕編碼器的脈沖數(shù)

    STM32(HAL)--使用定時器TIM的Encoder Mode來讀取旋鈕編碼器的脈沖數(shù)

    目錄 一 旋鈕編碼器相關知識 二 STM32CubeMx配置 三 程序編寫 3.1 相關函數(shù)介紹 3.2 程序編寫 四 實驗結果 旋轉編碼器是一種位置傳感器,輸出脈沖信號可以用來確定編碼器的旋轉角度和旋轉方向。 編碼器中有兩個開關,當旋鈕旋轉后,開關會依次導通,開關結構圖如下圖所示

    2024年02月15日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包