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

STM32步進(jìn)閉環(huán)控制、速度控制(張大頭Emm_V4.2驅(qū)動(dòng)器)速度控制 角度控制 位置控制

這篇具有很好參考價(jià)值的文章主要介紹了STM32步進(jìn)閉環(huán)控制、速度控制(張大頭Emm_V4.2驅(qū)動(dòng)器)速度控制 角度控制 位置控制。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

本文繼續(xù)簡(jiǎn)述使用stm32對(duì)張大頭步進(jìn)電機(jī)進(jìn)行速度控制和角度控制。
張大頭與stm32的硬件連接請(qǐng)看這個(gè)

要注意哈!usart模式要先通過張大頭的小屏幕進(jìn)行設(shè)置的哈??!要配置好波特率和地址。這些在張大頭提供的pdf說明文檔里面都有寫!


一、cubemx配置

基礎(chǔ)配置不說了,由于我們需要用stm32的usart,所以打開一個(gè)usart,波特率要和電機(jī)設(shè)置的匹配,我使用的是115200
STM32步進(jìn)閉環(huán)控制、速度控制(張大頭Emm_V4.2驅(qū)動(dòng)器)速度控制 角度控制 位置控制,stm32,單片機(jī),嵌入式硬件
然后生成代碼即可。

二、代碼

首先要知道,控制轉(zhuǎn)速和控制旋轉(zhuǎn)的角度發(fā)送的字節(jié)長(zhǎng)度不同。所以本文中默認(rèn)了電機(jī)的功能,只能在角度控制和速度控制中選擇一個(gè)。

1.datou.h文件

先看.h文件,文件中有兩個(gè)結(jié)構(gòu)體,一個(gè)是速度的,一個(gè)是角度控制的,角度控制里面有一個(gè)專門記錄當(dāng)前位置的值,這樣方便進(jìn)行角度控制。
還有一個(gè)枚舉,這個(gè)枚舉是來控制角度模式下的電機(jī)轉(zhuǎn)動(dòng)方向的,用1個(gè)0 來表示,那個(gè)不動(dòng)的2 是電機(jī)角度模式下到達(dá)指定位置的速度的高字節(jié),由于一般情況下到達(dá)指定位置的速度是設(shè)定好的,所以在角度控制模式下我沒有寫相應(yīng)的修改函數(shù)。extern StepperMotorControl moto1;這些聲明的變量都是.c文件中的,當(dāng)需要幾個(gè)電機(jī)的時(shí)候就創(chuàng)建幾個(gè)這樣的變量。

#ifndef __DATOU_H
#define __DATOU_H

#include "main.h"

typedef struct 
{
    uint8_t controlBytes[6];
    uint8_t lastControlBytes[6];

} StepperMotorControl;
typedef struct 
{
    uint8_t controlBytes[9];
    uint8_t lastControlBytes[9];
	float now_angle;
} StepperMotorControl_location;
typedef  enum 
{
	forward=0x12,		//正
	reverse=0x02		//反
}Command;
extern StepperMotorControl moto1;
extern StepperMotorControl moto2;
extern StepperMotorControl moto3;
extern StepperMotorControl moto4;
void StepperMotorControl_init(StepperMotorControl *control, uint8_t address);
void set_speed(StepperMotorControl *control, uint8_t direction, uint16_t speed);
void set_acceleration(StepperMotorControl *control, uint16_t acceleration);
extern StepperMotorControl_location moto_9;//下
extern StepperMotorControl_location moto_8;//上
void StepperMotorControl_init_location(StepperMotorControl_location *control, uint8_t address) ;
void set_angle_control_location(StepperMotorControl_location *control, float target_angle_num);

2.datou.c文件

有了對(duì).h文件的大體了解,現(xiàn)在我們來說一下.c文件
其中要注意的是在速度模式下只有3個(gè)可以調(diào)用的函數(shù),角度模式下有2個(gè)可以調(diào)用的函數(shù)

  • 速度模式下
    初始化
void StepperMotorControl_init(StepperMotorControl *control, uint8_t address);

設(shè)置速度

void set_speed(StepperMotorControl *control, uint8_t direction, uint16_t speed);

設(shè)置加速度

void set_acceleration(StepperMotorControl *control, uint16_t acceleration);
  • 角度模式下
    初始化
void StepperMotorControl_init_location(StepperMotorControl_location *control, uint8_t address) ;

設(shè)置角度

void set_angle_control_location(StepperMotorControl_location *control, float target_angle_num);

文件中有些static 的函數(shù),這些函數(shù)是用來進(jìn)行一些調(diào)用和判斷以及發(fā)送的,外部使用的時(shí)候不需要調(diào)用這些函數(shù)。

#include "datou.h"

#include <stdint.h>
#include <string.h>
#include <stdio.h>

#include <usart.h>
StepperMotorControl moto1;//一號(hào)輪
StepperMotorControl moto2;//二號(hào)輪
StepperMotorControl moto3;//三號(hào)輪
StepperMotorControl moto4;//四號(hào)輪
/******************************************************
Function:    		void StepperMotorControl_init(StepperMotorControl *control, uint8_t address) 
Description: 		指定電機(jī)初始化函數(shù)(這個(gè)函數(shù)是用來指定電機(jī)的速度的)
Calls:				 	NONE 
Input: 					StepperMotorControl *control這個(gè)變量是結(jié)構(gòu)體變量,這個(gè)結(jié)構(gòu)體里面有2個(gè)成員
								分別對(duì)應(yīng)了當(dāng)前發(fā)送的數(shù)據(jù),上次發(fā)送的數(shù)據(jù)
								address	是電機(jī)設(shè)定的地址
******************************************************/

void StepperMotorControl_init(StepperMotorControl *control, uint8_t address) 
{
    uint8_t defaultBytes[6] = {0x00, 0xF6, 0x10, 0x00, 0xaf, 0x6B};
    memcpy(control->controlBytes, defaultBytes, 6);
    memcpy(control->lastControlBytes, defaultBytes, 6);
    control->controlBytes[0] = address;
}

static uint8_t hasChanged(StepperMotorControl *control) 
{
    for (uint8_t i = 0; i < 6; i++) {
        if (control->controlBytes[i] != control->lastControlBytes[i]) 
				{
            return 1;
        }
    }
    return 0;
}

static void updateLastControlBytes(StepperMotorControl *control) 
{
    for (uint8_t i = 0; i < 6; i++) {
        control->lastControlBytes[i] = control->controlBytes[i];
    }
}

static void sendCommand(StepperMotorControl *control) 
{
    if (hasChanged(control)) {

				HAL_UART_Transmit(&huart3, control->controlBytes, 6, 100);
        updateLastControlBytes(control);
    }
}
/******************************************************
Function:    		void set_speed(StepperMotorControl *control, uint8_t direction, uint16_t speed) 
Description: 		設(shè)置電機(jī)的轉(zhuǎn)速
Calls:				 	static void sendCommand(StepperMotorControl *control) 
Input: 					StepperMotorControl *control這個(gè)變量是結(jié)構(gòu)體變量,這個(gè)結(jié)構(gòu)體里面有2個(gè)成員
								分別對(duì)應(yīng)了當(dāng)前發(fā)送的數(shù)據(jù),上次發(fā)送的數(shù)據(jù)
								direction 是電機(jī)的方向
								speed	是電機(jī)的速度
******************************************************/
void set_speed(StepperMotorControl *control, uint8_t direction, uint16_t speed) 
{
    if (direction) {
        control->controlBytes[2] = (0x10) | ((speed >> 8) & 0x0F); // 逆時(shí)針方向
    } else {
        control->controlBytes[2] = (0x00) | ((speed >> 8) & 0x0F); // 順時(shí)針方向
    }
    control->controlBytes[3] = speed & 0xFF;
    sendCommand(control);
}
/******************************************************
Function:    		void set_acceleration(StepperMotorControl *control, uint16_t acceleration) 
Description: 		設(shè)置電機(jī)的加轉(zhuǎn)速
Calls:				 	static void sendCommand(StepperMotorControl *control) 
Input: 					StepperMotorControl *control這個(gè)變量是結(jié)構(gòu)體變量,這個(gè)結(jié)構(gòu)體里面有2個(gè)成員
								分別對(duì)應(yīng)了當(dāng)前發(fā)送的數(shù)據(jù),上次發(fā)送的數(shù)據(jù)
								acceleration	是電機(jī)的加速度
******************************************************/
void set_acceleration(StepperMotorControl *control, uint16_t acceleration) 
{
    control->controlBytes[4] = acceleration;
    sendCommand(control);
}

StepperMotorControl_location moto_9;//下
StepperMotorControl_location moto_8;//上


/******************************************************
Function:    		void StepperMotorControl_init_location(StepperMotorControl_location *control, uint8_t address) 
Description: 		指定電機(jī)初始化函數(shù)(這個(gè)函數(shù)是用來指定電機(jī)的位置的)
Calls:				 	NONE 
Input: 					StepperMotorControl_location *control這個(gè)變量是結(jié)構(gòu)體變量,這個(gè)結(jié)構(gòu)體里面有3個(gè)成員
								分別對(duì)應(yīng)了當(dāng)前發(fā)送的數(shù)據(jù),上次發(fā)送的數(shù)據(jù),以及當(dāng)前的位置值
								address	是電機(jī)設(shè)定的地址
******************************************************/

void StepperMotorControl_init_location(StepperMotorControl_location *control, uint8_t address) 
{
	
	
    uint8_t defaultBytes[9] = {0x00, 0xFD, 0x12, 0x00, 0xaf,0x00,0x00,0x00,0x6B};
    memcpy(control->controlBytes, defaultBytes, 9);
    memcpy(control->lastControlBytes, defaultBytes, 9);
    control->controlBytes[0] = address;
}
static uint8_t hasChanged_location(StepperMotorControl_location *control) 
{
    for (uint8_t i = 0; i < 9; i++) {
        if (control->controlBytes[i] != control->lastControlBytes[i]) 
				{
            return 1;
        }
    }
    return 0;
}
static void updateLastControlBytes_location(StepperMotorControl_location *control) 
{
    for (uint8_t i = 0; i < 9; i++) {
        control->lastControlBytes[i] = control->controlBytes[i];
    }
}

static void sendCommand_location(StepperMotorControl_location *control) 
{
    if (hasChanged_location(control)) {

				HAL_UART_Transmit(&huart3, control->controlBytes, 9, 100);
        updateLastControlBytes_location(control);
    }
}

static void set_location(StepperMotorControl_location *control, Command com, int pulse_num) 
{		
	control->controlBytes[2] =com;
	
	control->controlBytes[6] = pulse_num>>8;/* 脈沖數(shù)中字節(jié) */
	control->controlBytes[7] = pulse_num-((pulse_num>>8)<<8);	/* 脈沖數(shù)低字節(jié) */

    sendCommand_location(control);
}


/******************************************************
Function:    	void set_angle_control_location(StepperMotorControl_location *control, float target_angle_num)
Description: 	控制指定電機(jī)的角度
Calls:				 static void set_location(StepperMotorControl_location *control, Command com, int pulse_num) 
Input: 					StepperMotorControl_location *control這個(gè)變量是結(jié)構(gòu)體變量,這個(gè)結(jié)構(gòu)體里面有3個(gè)成員
								分別對(duì)應(yīng)了當(dāng)前發(fā)送的數(shù)據(jù),上次發(fā)送的數(shù)據(jù),以及當(dāng)前的位置值(由于需要通過用角度的差值來計(jì)算脈沖數(shù),所以需要記錄當(dāng)前的位置)
								target_angle_num	是目標(biāo)角度
******************************************************/
#define a_circle_pulse 3200.0//這是一圈需要的脈沖數(shù)
void set_angle_control_location(StepperMotorControl_location *control, float target_angle_num)
{
	double error_angle=target_angle_num-(control->now_angle);
	int need_pulse=(int)(error_angle/360.0*a_circle_pulse);
	if(error_angle!=0)
	{
		if(need_pulse<0)
		{
			set_location(control,reverse, -need_pulse);//注意此處的reverse可能需要改成forward,這個(gè)要根據(jù)你的物理結(jié)構(gòu)而定
		}
		else
		{
			set_location(control,forward, need_pulse);//注意此處的forward可能需要改成reverse,這個(gè)要根據(jù)你的物理結(jié)構(gòu)而定
		}
		control->now_angle=target_angle_num;
		
	}
}

3. 主函數(shù)編寫以及函數(shù)調(diào)用

在主函數(shù)中

	/*底盤電機(jī)初始化*/		
	StepperMotorControl_init(&moto1,0x01);
	StepperMotorControl_init(&moto2,0x02);
	StepperMotorControl_init(&moto3,0x03);
	StepperMotorControl_init(&moto4,0x04);	
	
	HAL_Delay(100);	
	/*云臺(tái)電機(jī)初始化*/		
	StepperMotorControl_init_location(&moto_9,0x09);//下云臺(tái)是9
	StepperMotorControl_init_location(&moto_8,0x08);
	HAL_Delay(100);

	set_angle_control_location(&moto_8,-900);//電機(jī)轉(zhuǎn)-900度
	HAL_Delay(2000);
	set_speed(&moto1,1,200) ;//電機(jī)正轉(zhuǎn)且速度為200


總結(jié)

代碼的可讀性可能不算高,emm,望大佬指正。謝謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-626896.html

到了這里,關(guān)于STM32步進(jìn)閉環(huán)控制、速度控制(張大頭Emm_V4.2驅(qū)動(dòng)器)速度控制 角度控制 位置控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 小白從零開始:STM32雙閉環(huán)(速度環(huán)、位置環(huán))電機(jī)控制(硬件篇)

    小白從零開始:STM32雙閉環(huán)(速度環(huán)、位置環(huán))電機(jī)控制(硬件篇)

    小白從零開始:STM32平鋪式雙閉環(huán)(速度環(huán)、位置環(huán))電機(jī)控制(硬件篇) 小白從零開始:STM32雙閉環(huán)(速度環(huán)、位置環(huán))電機(jī)控制(軟件篇) 小白從零開始:小程序阿里云平臺(tái)控制stm32(硬件篇) 杭州研究生手把手教你搞不定STM32 使用工具: 1.PCB設(shè)計(jì): 立創(chuàng)EDA+嘉立創(chuàng) 2.硬件

    2024年02月16日
    瀏覽(21)
  • MKS SERVO42&57D 閉環(huán)步進(jìn)電機(jī)_系列12 STM32_CAN例程

    MKS SERVO42&57D 閉環(huán)步進(jìn)電機(jī)_系列12 STM32_CAN例程

    具備脈沖接口和RS485/CAN串行接口,支持MODBUS-RTU通訊協(xié)議,內(nèi)置高效FOC矢量算法。 硬件開源! 網(wǎng)盤: 08_例程-STM32系列(CAN) 設(shè)置波特率: 菜單 → CanRate → 500K 設(shè)置從機(jī)地址: 菜單 → CanID → 01 需要一個(gè)TTL轉(zhuǎn)CAN電平模塊。 接線說明 代碼說明 代碼功能:STM32 主板通過CAN接口讀取

    2024年02月10日
    瀏覽(26)
  • MKS SERVO42&57D 閉環(huán)步進(jìn)電機(jī)_系列11 STM32_脈沖和串口例程

    MKS SERVO42&57D 閉環(huán)步進(jìn)電機(jī)_系列11 STM32_脈沖和串口例程

    MKS SERVO 28D/35D/42D/57D 系列閉環(huán)步進(jìn)電機(jī)是創(chuàng)客基地為滿足市場(chǎng)需求而自主研發(fā)的一款產(chǎn)品。具備脈沖接口和RS485/CAN串行接口,支持MODBUS-RTU通訊協(xié)議,內(nèi)置高效FOC矢量算法,采用高精度編碼器,通過位置反饋,有效防止電機(jī)丟步。適合小型機(jī)械臂,3D打印機(jī),雕刻機(jī),寫字機(jī),

    2024年02月12日
    瀏覽(216)
  • 閉環(huán)控制步進(jìn)電機(jī)對(duì)比傳統(tǒng)開環(huán)控制的優(yōu)點(diǎn)

    閉環(huán)控制步進(jìn)電機(jī)對(duì)比傳統(tǒng)開環(huán)控制的優(yōu)點(diǎn)

    在工業(yè)自動(dòng)化中,步進(jìn)電機(jī)的應(yīng)用非常的廣泛,例如工業(yè)機(jī)器人、3D打印機(jī)、計(jì)算機(jī)硬盤等都有步進(jìn)電機(jī)的身影。傳統(tǒng)的步進(jìn)電機(jī)可以控制轉(zhuǎn)子的角度位置,而不需要傳感器來控制位置,是一種開環(huán)控制系統(tǒng),在這樣的控制方式下,步進(jìn)電機(jī)控制脈沖的輸入并不依賴于轉(zhuǎn)子的

    2023年04月17日
    瀏覽(28)
  • STM32控制42步進(jìn)電機(jī)

    STM32控制42步進(jìn)電機(jī)

    首先采用TB6600驅(qū)動(dòng)外接12VDC電源。 STM32選c8t6最小系統(tǒng)板 接線TB6600跟32接線有共陰級(jí)接法(把ENA-,DIR-,PUL-與32共地)也有共陽接法(把ENA+,DIR+,PUL+與32共地)。這里選共陰級(jí)接法。 判斷42步進(jìn)電機(jī)的4根線哪兩根是A相(A-和A+),哪兩根是B相(B-和B+),方法:將任意兩根線短接起來

    2024年02月16日
    瀏覽(27)
  • STM32基于CAN總線協(xié)議控制步進(jìn)電機(jī)

    STM32基于CAN總線協(xié)議控制步進(jìn)電機(jī)

    如上圖所示,實(shí)現(xiàn)了以下功能: 1.兩塊stm32單片機(jī)通過CAN控制器與收發(fā)器進(jìn)行半雙工通信; 2.stm32主機(jī)通過檢測(cè)按鍵,切換不同的模式,將不同模式的case值發(fā)送給stm32從機(jī); 3.stm32從機(jī)根據(jù)收到的case值,控制步進(jìn)電機(jī)進(jìn)行不同的運(yùn)動(dòng)操作; 4.OLED用于顯示收發(fā)內(nèi)容與按鍵狀態(tài)等

    2024年01月19日
    瀏覽(20)
  • STM32控制四個(gè)步進(jìn)電機(jī)(包含運(yùn)行程序)

    軟件: keil 5(其他版本也ok) 硬件: 步進(jìn)電機(jī)(我用的是42)×4;單片機(jī)開發(fā)板(本例使用STM32F407ZGT6);電機(jī)驅(qū)動(dòng)器×4;外部按鍵;杜邦線。 實(shí)驗(yàn)效果: 四個(gè)步進(jìn)電機(jī)對(duì)應(yīng)四個(gè)外部按鍵,按下對(duì)應(yīng)的外部按鍵選擇需要控制的電機(jī)。 在開發(fā)板上按下KEYO,步進(jìn)電機(jī)以500HZ的頻率

    2024年04月29日
    瀏覽(27)
  • 用STM32定時(shí)器中斷產(chǎn)生PWM控制步進(jìn)電機(jī)

    用STM32定時(shí)器中斷產(chǎn)生PWM控制步進(jìn)電機(jī)

    控制步進(jìn)電機(jī)可以使用PWM、定時(shí)器中斷、延時(shí),這里用的就是 定時(shí)器中斷來讓它轉(zhuǎn)動(dòng)。 板子用的是正點(diǎn)原子的STM32F103 mini板,驅(qū)動(dòng)器是DM420(DM420驅(qū)動(dòng)器資料),用開關(guān)電源供電,電機(jī)就是普通的42步進(jìn)電機(jī),步距角為1.8°,雖然按照?qǐng)D片來看它是個(gè)蠕動(dòng)泵。如下圖 PUL+——PB0,

    2023年04月09日
    瀏覽(20)
  • 【STM32F429】HAL庫(kù)的PWM中斷,精確控制脈沖數(shù),控制步進(jìn)電機(jī)

    【STM32F429】HAL庫(kù)的PWM中斷,精確控制脈沖數(shù),控制步進(jìn)電機(jī)

    這兩天在調(diào)步進(jìn)電機(jī),希望是使得步進(jìn)電機(jī)每次都達(dá)到期望的高度。在查了一天的資料,發(fā)現(xiàn)大部分上傳的資料都是使用CubeMX生成的,可復(fù)制性很高,但未免有失可讀性,故上傳我的心得經(jīng)驗(yàn)。 本來原子哥的例程里有整合度很高的,已經(jīng)封裝好的精確控制步進(jìn)電機(jī)前進(jìn)距離的

    2024年02月08日
    瀏覽(24)
  • stm32F103單片機(jī)pwm控制伺服驅(qū)動(dòng)器進(jìn)而控制步進(jìn)電機(jī)

    stm32F103單片機(jī)pwm控制伺服驅(qū)動(dòng)器進(jìn)而控制步進(jìn)電機(jī)

    1.需要一臺(tái)步進(jìn)電機(jī),私服驅(qū)動(dòng)器,stm32單片機(jī);先按照說明文檔,連接好硬件相關(guān)線路,對(duì)應(yīng)好sign+,sign-,puls+,puls-線路,其中sign只是個(gè)io口拉高拉低操作,puls是pwm波形輸出口,雖然有兩根線,但只是需要控制一個(gè)IO口輸出波形即可; 采用主從模式,TIM1為主定時(shí)器,tim3未從定

    2024年02月04日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包