找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4074|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STM32F4+A3984芯片簡單的步進(jìn)電機(jī)控制程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:498764 發(fā)表于 2019-3-26 22:05 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
采用A3984驅(qū)動(dòng)芯片
同時(shí)也兼容不部分驅(qū)動(dòng)器
控制主要包括三點(diǎn):PWM脈沖輸出,DIR方向選擇,EN控制使能
采用定時(shí)器輸出比較模式

單片機(jī)源程序如下:
  1. #include "stm32f4xx.h"
  2. #include "MicroStepDriver.h"
  3. #include "bsp_debug_usart.h"
  4. #include "mpu6050.h"

  5. /**
  6.   * @brief  主函數(shù)
  7.   * @param  無  
  8.   * @retval 無
  9.   */
  10. int main(void)
  11. {
  12. //          signed int step;          //步數(shù)
  13. //    signed int now_place;     //當(dāng)前角度

  14.         //步進(jìn)電機(jī)初始化
  15.         MSD_Init();

  16.     while(1)
  17.   {

  18.         }
  19.                           
  20. }
  21. /*********************************************END OF FILE**********************/
復(fù)制代碼
  1. #include "MicroStepDriver.h"
  2. #include <stdio.h>
  3. #include <math.h>
  4. //系統(tǒng)加減速參數(shù)
  5. //speedRampData srd;
  6. ////記錄步進(jìn)電機(jī)的位置
  7. //int stepPosition = 0;
  8. ////系統(tǒng)電機(jī)、串口狀態(tài)
  9. //struct GLOBAL_FLAGS status = {FALSE, FALSE,TRUE};

  10. /**

  11.   * @brief  定時(shí)器中斷優(yōu)先級(jí)配置

  12.   * @param  無

  13.   * @retval 無

  14.   */
  15. static void TIM_NVIC_Config(void)

  16. {
  17.     NVIC_InitTypeDef NVIC_InitStructure;
  18.     // 設(shè)置中斷組為0
  19.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);               
  20.         // 設(shè)置中斷來源
  21.     NVIC_InitStructure.NVIC_IRQChannel = MSD_PULSE_TIM_IRQ;        
  22.         // 設(shè)置搶占優(yōu)先級(jí)
  23.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;         
  24.         // 設(shè)置子優(yōu)先級(jí)
  25.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;       
  26.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  27.     NVIC_Init(&NVIC_InitStructure);

  28. }
  29. /**

  30.   * @brief  初始化電機(jī)驅(qū)動(dòng)用到的引腳

  31.   * @param  無

  32.   * @retval 無

  33.   */
  34. static void MSD_GPIO_Config(void)
  35. {
  36.     GPIO_InitTypeDef GPIO_InitStructure;

  37.     //電機(jī)脈沖輸出 GPIO 初始化
  38.     MSD_PULSE_AHBxClock_FUN(MSD_PULSE_GPIO_CLK, ENABLE);
  39.     GPIO_InitStructure.GPIO_Pin =  MSD_PULSE_PIN;
  40.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  41.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  42.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  43.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  44.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  45.     GPIO_Init(MSD_PULSE_PORT, &GPIO_InitStructure);
  46.       /*  連接 PXx 到 定時(shí)器輸出通道*/
  47.     GPIO_PinAFConfig(MSD_PULSE_PORT,MSD_PULSE_PIN_SOURCE,MSD_PULSE_PIN_AF);
  48.    
  49.     //電機(jī)方向輸出 GPIO 、細(xì)分、reset、sleep初始化
  50.     MSD_DIR_AHBxClock_FUN(MSD_DIR_GPIO_CLK, ENABLE);
  51.     GPIO_InitStructure.GPIO_Pin =  MSD_DIR_PIN;
  52.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  53.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  54.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  55.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56.     GPIO_Init(MSD_DIR_PORT, &GPIO_InitStructure);
  57.     GPIO_ResetBits(MSD_DIR_PORT,MSD_DIR_PIN);
  58.                
  59.         //電機(jī)使能輸出 GPIO 初始化
  60.     MSD_ENA_AHBxClock_FUN(MSD_ENA_GPIO_CLK, ENABLE);
  61.     GPIO_InitStructure.GPIO_Pin =  MSD_ENA_PIN;
  62.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  63.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  64.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  65.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  66.     GPIO_Init(MSD_ENA_PORT, &GPIO_InitStructure);
  67.     GPIO_ResetBits(MSD_ENA_PORT,MSD_ENA_PIN);
  68. }


  69. ///*
  70. // * 注意:TIM_TimeBaseInitTypeDef結(jié)構(gòu)體里面有5個(gè)成員,TIM6和TIM7的寄存器里面只有
  71. // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的時(shí)候只需初始化這兩個(gè)成員即可,
  72. // * 另外三個(gè)成員是通用定時(shí)器和高級(jí)定時(shí)器才有.
  73. // *-----------------------------------------------------------------------------
  74. // *typedef struct
  75. // *{ TIM_Prescaler            都有
  76. // *  TIM_CounterMode                   TIMx,x[6,7]沒有,其他都有
  77. // *  TIM_Period               都有
  78. // *  TIM_ClockDivision        TIMx,x[6,7]沒有,其他都有
  79. // *  TIM_RepetitionCounter    TIMx,x[1,8,15,16,17]才有
  80. // *}TIM_TimeBaseInitTypeDef;
  81. // *-----------------------------------------------------------------------------
  82. // */

  83. /* ----------------   PWM信號(hào) 周期和占空比的計(jì)算--------------- */
  84. // ARR :自動(dòng)重裝載寄存器的值
  85. // CLK_cnt:計(jì)數(shù)器的時(shí)鐘,等于 Fck_int / (psc+1) = 168M/(psc+1)
  86. // PWM 信號(hào)的周期 T = (ARR+1) * (1/CLK_cnt) = (ARR+1)*(PSC+1) / 72M
  87. // 占空比P=CCR/(ARR+1)

  88. static void TIM_Mode_Config(void)
  89. {
  90.   // 開啟定時(shí)器時(shí)鐘,即內(nèi)部時(shí)鐘CK_INT=168M
  91.         MSD_PULSE_TIM_APBxClock_FUN(MSD_PULSE_TIM_CLK,ENABLE);

  92.     /*--------------------時(shí)基結(jié)構(gòu)體初始化-------------------------*/
  93.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  94.         TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  95.     // 自動(dòng)重裝載寄存器的值,累計(jì)TIM_Period+1個(gè)周期后產(chǎn)生一個(gè)更新或者中斷
  96.         TIM_TimeBaseStructure.TIM_Period=MSD_PULSE_TIM_PERIOD;       
  97.         // 驅(qū)動(dòng)CNT計(jì)數(shù)器的時(shí)鐘 = Fck_int/(psc+1)
  98.         TIM_TimeBaseStructure.TIM_Prescaler= MSD_PULSE_TIM_PSC;       
  99.         // 時(shí)鐘分頻因子 ,配置死區(qū)時(shí)間時(shí)需要用到
  100.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
  101.         // 計(jì)數(shù)器計(jì)數(shù)模式,設(shè)置為向上計(jì)數(shù)
  102.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  103.         // 重復(fù)計(jì)數(shù)器的值,最大值為255
  104.         //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
  105.         // 初始化定時(shí)器
  106.         TIM_TimeBaseInit(MSD_PULSE_TIM, &TIM_TimeBaseStructure);

  107.         /*--------------------輸出比較結(jié)構(gòu)體初始化-------------------*/               
  108.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  109.         // 配置為PWM模式2
  110.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  111.         // 輸出使能
  112.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  113.         // 互補(bǔ)輸出禁能
  114.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  115.         // 設(shè)置占空比大小
  116.         TIM_OCInitStructure.TIM_Pulse = MSD_PULSE_TIM_PERIOD/2;
  117.         // 輸出通道電平極性配置
  118.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  119.         // 輸出通道空閑電平極性配置
  120.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  121.    
  122.         MSD_PULSE_OCx_Init(MSD_PULSE_TIM, &TIM_OCInitStructure);
  123.     //使能TIM1_CH1預(yù)裝載寄存器
  124.         MSD_PULSE_OCx_PreloadConfig(MSD_PULSE_TIM, TIM_OCPreload_Enable);
  125.     //使能TIM1預(yù)裝載寄存器
  126.     TIM_ARRPreloadConfig(MSD_PULSE_TIM, ENABLE);
  127.    
  128.     //設(shè)置中斷源,只有溢出時(shí)才中斷
  129.     TIM_UpdateRequestConfig(MSD_PULSE_TIM,TIM_UpdateSource_Regular);
  130.         // 清除中斷標(biāo)志位
  131.         TIM_ClearITPendingBit(MSD_PULSE_TIM, TIM_IT_Update);
  132.     // 使能中斷
  133.     TIM_ITConfig(MSD_PULSE_TIM, TIM_IT_Update, ENABLE);
  134.         // 使能計(jì)數(shù)器
  135.         TIM_Cmd(MSD_PULSE_TIM, ENABLE);
  136. }
  137. /**

  138.   * @brief  初始化電機(jī)相關(guān)的外設(shè)

  139.   * @param  無

  140.   * @retval 無

  141.   */
  142. void MSD_Init(void)
  143. {
  144.     MSD_GPIO_Config();
  145.    
  146.     TIM_NVIC_Config();

  147.     TIM_Mode_Config();   
  148. }


  149. /*********************************************END OF FILE**********************/
復(fù)制代碼

  1. #include "mpu6050.h"
  2. #include "string.h"

  3. struct STime                stcTime;
  4. struct SAcc                 stcAcc;
  5. struct SGyro                 stcGyro;
  6. struct SAngle         stcAngle;
  7. struct SMag                 stcMag;
  8. struct SDStatus stcDStatus;
  9. struct SPress         stcPress;
  10. struct SLonLat         stcLonLat;
  11. struct SGPSV                 stcGPSV;

  12. //unsigned char [250];

  13. //CopeSerialData為串口中斷調(diào)用函數(shù),串口每收到一個(gè)數(shù)據(jù),調(diào)用一次這個(gè)函數(shù)。
  14. //處理串口接收到的陀螺儀數(shù)據(jù)
  15. void CopeSerialData(unsigned char ucData)
  16. {
  17.         static unsigned char ucRxBuffer[250];
  18.         static unsigned char ucRxCnt = 0;       
  19.        
  20.         ucRxBuffer[ucRxCnt++]=ucData;
  21.         if (ucRxBuffer[0]!=0x55) //數(shù)據(jù)頭不對(duì),則重新開始尋找0x55數(shù)據(jù)頭
  22.         {
  23.                 ucRxCnt=0;
  24.                 return;
  25.         }
  26.         if (ucRxCnt<11) {return;}//數(shù)據(jù)不滿11個(gè),則返回
  27.         else
  28.         {
  29.                 switch(ucRxBuffer[1])
  30.                 {
  31.                         case 0x50:        memcpy(&stcTime,&ucRxBuffer[2],8);break;//memcpy為編譯器自帶的內(nèi)存拷貝函數(shù),需引用"string.h",將接收緩沖區(qū)的字符拷貝到數(shù)據(jù)共同體里面,從而實(shí)現(xiàn)數(shù)據(jù)的解析。
  32.                         case 0x51:        memcpy(&stcAcc,&ucRxBuffer[2],8);break;
  33.                         case 0x52:        memcpy(&stcGyro,&ucRxBuffer[2],8);break;
  34.                         case 0x53:        memcpy(&stcAngle,&ucRxBuffer[2],8);break;
  35.                     case 0x54:        memcpy(&stcMag,&ucRxBuffer[2],8);break;
  36.                         case 0x55:        memcpy(&stcDStatus,&ucRxBuffer[2],8);break;
  37.                         case 0x56:        memcpy(&stcPress,&ucRxBuffer[2],8);break;
  38.                         case 0x57:        memcpy(&stcLonLat,&ucRxBuffer[2],8);break;
  39.                         case 0x58:        memcpy(&stcGPSV,&ucRxBuffer[2],8);break;
  40.                 }
  41.                 ucRxCnt=0;
  42.         }
  43. }
復(fù)制代碼


所有資料51hei提供下載:
定時(shí)器.7z (355.16 KB, 下載次數(shù): 37)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:741018 發(fā)表于 2020-5-20 20:30 來自觸屏版 | 只看該作者
有電路圖嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:51588 發(fā)表于 2025-5-10 09:59 | 只看該作者
代碼不行的,
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表