STM32用PWM驅動步進電機

硬件介紹:

連線:

注意這里stp連的是pwm脈沖,dir連的是方向到時候代碼pwm波形就是從這里來的,具體接線根據你的代碼來

注意要點:步進電機和舵機驅動是不一樣的,它是根據步長來移動的,所以要開一個中斷,來計算步長,具體代碼,可以看看。

代碼部分:

#include "stm32f10x.h"
#include "math.h"

// 步進電機參數配置
#define STEPS_PER_REVOLUTION 200 ? ? ?// 每轉步數 (1.8°/步)
#define MICROSTEPS ? ? ? ? ? 16 ? ? ? // 微步細分

// 全局變量
volatile uint32_t step_count = 0;
float current_angle = 0.0f;

// 初始化函數
void Stepper_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

? ? // 1. 使能時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

? ? // 2. 配置PWM輸出引腳 (PA1 - TIM2_CH2)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

? ? // 3. 配置方向控制引腳 (PA2)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

? ? // 4. 配置定時器時基
TIM_TimeBaseStructure.TIM_Period = 7200 - 1; ? ? // 初始頻率約10Hz @72MHz
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

? ? // 5. PWM 輸出配置
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = 3600; // 50% 占空比
TIM_OC2Init(TIM2, &TIM_OCInitStructure);

? ? // 6. 配置更新中斷
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

? ? TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}

// 啟動電機
void Start_Motor(void)
{
step_count = 0;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_Cmd(TIM2, ENABLE);
}

// 停止電機
void Stop_Motor(void)
{
TIM_Cmd(TIM2, DISABLE);
TIM_SetCompare2(TIM2, 0);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}

// 設置電機速度 (RPM)
void Set_Motor_Speed(float rpm)
{
if (rpm <= 0) return;

? ? uint32_t freq = (uint32_t)(rpm * STEPS_PER_REVOLUTION * MICROSTEPS / 60.0f);
if (freq == 0) return;

? ? uint32_t arr = (72000000UL / (72UL * freq)) - 1;
if (arr < 10) arr = 10; // 防止太小導致溢出

? ? TIM_SetAutoreload(TIM2, arr);
TIM_SetCompare2(TIM2, arr / 2); // 保持50%占空比
}

// 旋轉到指定角度(度)
void Rotate_To_Angle(float target_angle, float speed_rpm)
{
float angle_diff = target_angle - current_angle;

? ? while(angle_diff > 180.0f) angle_diff -= 360.0f;
while(angle_diff < -180.0f) angle_diff += 360.0f;

? ? int32_t required_steps = (int32_t)(angle_diff * STEPS_PER_REVOLUTION * MICROSTEPS / 360.0f);

? ? if(required_steps >= 0) {
GPIO_SetBits(GPIOA, GPIO_Pin_2); ? // 正轉
} else {
GPIO_ResetBits(GPIOA, GPIO_Pin_2); // 反轉
required_steps = -required_steps;
}

? ? Set_Motor_Speed(speed_rpm);

? ? uint32_t total_steps = (uint32_t)required_steps;
step_count = 0;

? ? Start_Motor();

? ? while(step_count < total_steps) {
__NOP();
}

? ? Stop_Motor();

? ? current_angle = target_angle;
}

// 中斷服務函數
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
step_count++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}

這是pwm部分

#include "stm32f10x.h" ? ? ? ? ? ? ? ? ?// Device header
#include "Delay.h"
#include "PWM.h"

// 主函數
int main(void)
{
__enable_irq(); ? ? ? ? ? ? ? ? ? ? // 開啟全局中斷

? ? Stepper_Init(); ? ? ? ? ? ? ? ? ? ? // 初始化步進電機驅動

? ? // 第一次旋轉到90度
Rotate_To_Angle(90.0f, 60.0f);
Delay_ms(500);

? ? // 第二次旋轉到-90度
Rotate_To_Angle(-90.0f, 30.0f);
Delay_ms(2000);

? ? // 進入主循環
while(1)
{
// 可以繼續添加其他操作
}
}
這是主函數

注意要是想要同時驅動兩個步進電機,代碼還是要稍微修改的。后續代碼再發

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88850.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣25.7.10每日一題——重新安排會議得到最多空余時間 II

Description 今天這道題和昨天類似&#xff0c;只是允許順序變化。 Solution 把會議區間視作桌子&#xff0c;空余時間視作空位&#xff0c;我們要把一個桌子移到別的空位中。 初步想法是枚舉桌子&#xff0c;找一個長度大于等于桌子長度的空位移過去。看上去&#xff0c;找…

IP報文分片與重組原理及實現分析

IP報文分片與重組原理及實現分析 引用&#xff1a; ppp/net/packet/IPFragment.hppp/net/packet/IPFragment.cpp 1. IP分片原理 當IP數據包大小超過MTU&#xff08;最大傳輸單元&#xff09;時&#xff0c;路由器/主機將其分割為多個片段傳輸&#xff0c;每個片段包含&…

[python]在drf中使用drf_spectacular

安裝drf_spectacular 文檔 pypi鏈接:https://pypi.org/project/drf-spectacular/ 文檔鏈接:https://drf-spectacular.readthedocs.io/en/latest/readme.html 安裝步驟 在環境中添加 pip install drf-spectacular在setting的INSTALLED_APPS中添加 INSTALLED_APPS [# ALL…

【Datawhale AI 夏令營】 用AI做帶貨視頻評論分析(二)

5.預訓練模型跑分 回顧賽題 回顧賽題任務 挑戰與難點&#xff1a; 標注數據少 ——> 半監督學習 or 數據增強 聚類分析噪點影響嚴重 回顧Baseline 問題&#xff1a; TF-IDF無法捕捉以下語義。聚類分析粗糙&#xff0c;未評估聚類質量。 提升方案&#xff1a; 分類任務…

SPSSPRO:數據分析市場SaaS挑戰者的戰略分析

目錄 第一部分&#xff1a;執行摘要 第二部分&#xff1a;平臺解構&#xff1a;產品、架構與用戶體驗 2.1 SaaS范式轉移&#xff1a;架構與起源 2.2 功能能力&#xff1a;分析師的工具箱 2.3 “智能分析”的價值主張 第三部分&#xff1a;市場滲透與受眾細分 3.1 目標用戶…

低版本hive(1.2.1)UDF實現清除歷史分區數據

目標&#xff1a;通過UDF實現對表歷史數據清除 入參&#xff1a;表名、保留天數N 一、pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

C++中頂層const與底層const

在C中&#xff0c;const關鍵字用于定義常量&#xff0c;但它在指針和引用上下文中會產生兩種不同的常量性&#xff1a;頂層const&#xff08;top-level const&#xff09;和底層const&#xff08;low-level const&#xff09;。理解它們的區別是避免編譯錯誤和提高代碼質量的關…

“SRP模型+”多技術融合在生態環境脆弱性評價模型構建、時空格局演變分析與RSEI指數生態質量評價

集成云端、桌面端等環境&#xff0c;結合遙感云計算、GIS空間分析&#xff0c;R語言統計分析的優勢&#xff0c;以分析生態環境脆弱性的時空演變為主線。通過本課程的學習&#xff0c;您將掌握&#xff1a;第一&#xff0c;收集各類指標數據&#xff0c;構建的“生態壓力度-生態…

算法學習筆記:17.蒙特卡洛算法 ——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

在計算機科學和數學領域&#xff0c;蒙特卡洛算法&#xff08;Monte Carlo Algorithm&#xff09;以其獨特的隨機抽樣思想&#xff0c;成為解決復雜問題的有力工具。從圓周率的計算到金融風險評估&#xff0c;從物理模擬到人工智能&#xff0c;蒙特卡洛算法都發揮著不可替代的作…

Tortoise 設置

如何關閉 Windows 下 TortoiseGit 任務欄里窗口標題的分支顯示 一、引言 TortoiseGit 是一個專為團隊協作設計的 Git 圖形化客戶端&#xff0c;旨在解決版本控制中常見的問題&#xff0c;如沖突、回滾、歷史查看等。本文檔是 TortoiseGit 的使用手冊前言部分&#xff0c;旨在向…

[論文閱讀] 人工智能 + 軟件工程 | AI助力軟件可解釋性:從用戶評論到自動生成需求與解釋

AI助力軟件可解釋性&#xff1a;從用戶評論到自動生成需求與解釋 Automatic Generation of Explainability Requirements and Software Explanations From User ReviewsarXiv:2507.07344 Automatic Generation of Explainability Requirements and Software Explanations From …

C語言---自定義類型(上)(結構體類型)

結構體結構體的定義與聲明結構體其實和數組一樣&#xff0c;都是一些值的集合&#xff0c;只不過數組是一系類相同類型的值&#xff0c;而結構體里邊的成員可以是不同的數據類型。關于它的聲明&#xff0c;所用到的關鍵字是struct。聲明的語法如下&#xff1a;struct 結構體名{…

Java觀察者模式實現方式與測試方法

一、實現方式 自定義實現 通過手動定義Subject和Observer接口&#xff0c;實現一對多依賴關系&#xff1a; // 觀察者接口 public interface Observer {void update(float temp, float humidity, float pressure); } // 主題接口 public interface Subject {void registerObser…

leetGPU解題筆記(1)

1.題面 題目要求 向量加法 實現一個程序&#xff0c;在GPU上對兩個包含32位浮點數的向量執行逐元素加法。該程序應接受兩個長度相等的輸入向量&#xff0c;并生成一個包含它們和的輸出向量。 實現要求 禁止使用外部庫 solve函數簽名必須保持不變 最終結果必須存儲在向量C中 示例…

5. JVM 的方法區

1. JVM介紹和運行流程-CSDN博客 2. 什么是程序計數器-CSDN博客 3. java 堆和 JVM 內存結構-CSDN博客 4. 虛擬機棧-CSDN博客 5. JVM 的方法區-CSDN博客 6. JVM直接內存-CSDN博客 7. JVM類加載器與雙親委派模型-CSDN博客 8. JVM類裝載的執行過程-CSDN博客 9. JVM垃圾回收…

網絡安全的基本練習

一.docker搭建 1.安裝dockerapt-get install docker.io docker-compose2.編寫配置文件&#xff08;注意路徑正確&#xff09;vim /etc/systemd/system/docker.service.d/http-proxy.conf[Service] Environment"HTTP_PROXYhttp://科學上網訪問的ip:端口" Environment&…

380. O(1) 時間插入、刪除和獲取隨機元素

實現RandomizedSet 類&#xff1a; RandomizedSet() 初始化 RandomizedSet 對象 bool insert(int val) 當元素 val 不存在時&#xff0c;向集合中插入該項&#xff0c;并返回 true &#xff1b;否則&#xff0c;返回 false 。 bool remove(int val) 當元素 val 存在時&#xff…

【LeetCode Hot100 | 每日刷題】字母異位詞分組

題目鏈接&#xff1a;49. 字母異位詞分組 - 力扣&#xff08;LeetCode&#xff09; 題目&#xff1a; 給你一個字符串數組&#xff0c;請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 示例 1: 輸入: strs ["eat", "tea", "tan"…

docker 安裝windows

目錄 下載地址&#xff1a; 使用教程&#xff1a; docker compose 查看版本 測試啟動 hello-world 報錯1 The system cannot find the file specified&#xff1a; 檢查 Docker Desktop 是否運行中 報錯2HF_ENDPOINT 1. 臨時解決方案&#xff08;當前終端會話有效&…

docker compose 和build

目錄 docker compose 和build 的區別是什么&#xff1f; 核心差別&#xff1a; 1. docker build --platform linux/amd64 -f Dockerfile -t infiniflow/ragflow:nightly_lbg . 2. docker compose -f docker-compose-gpu.yml up -d 二者如何配合&#xff1f; 總結 docker …