久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3817|回復: 1
收起左側

STM32F4+A3984芯片簡單的步進電機控制程序

[復制鏈接]
ID:498764 發表于 2019-3-26 22:05 | 顯示全部樓層 |閱讀模式
采用A3984驅動芯片
同時也兼容不部分驅動器
控制主要包括三點:PWM脈沖輸出,DIR方向選擇,EN控制使能
采用定時器輸出比較模式

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

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

  14.         //步進電機初始化
  15.         MSD_Init();

  16.     while(1)
  17.   {

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

  10. /**

  11.   * @brief  定時器中斷優先級配置

  12.   * @param  無

  13.   * @retval 無

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

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

  28. }
  29. /**

  30.   * @brief  初始化電機驅動用到的引腳

  31.   * @param  無

  32.   * @retval 無

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

  37.     //電機脈沖輸出 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 到 定時器輸出通道*/
  47.     GPIO_PinAFConfig(MSD_PULSE_PORT,MSD_PULSE_PIN_SOURCE,MSD_PULSE_PIN_AF);
  48.    
  49.     //電機方向輸出 GPIO 、細分、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.         //電機使能輸出 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結構體里面有5個成員,TIM6和TIM7的寄存器里面只有
  71. // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的時候只需初始化這兩個成員即可,
  72. // * 另外三個成員是通用定時器和高級定時器才有.
  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信號 周期和占空比的計算--------------- */
  84. // ARR :自動重裝載寄存器的值
  85. // CLK_cnt:計數器的時鐘,等于 Fck_int / (psc+1) = 168M/(psc+1)
  86. // PWM 信號的周期 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.   // 開啟定時器時鐘,即內部時鐘CK_INT=168M
  91.         MSD_PULSE_TIM_APBxClock_FUN(MSD_PULSE_TIM_CLK,ENABLE);

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

  107.         /*--------------------輸出比較結構體初始化-------------------*/               
  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.         // 互補輸出禁能
  114.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  115.         // 設置占空比大小
  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預裝載寄存器
  124.         MSD_PULSE_OCx_PreloadConfig(MSD_PULSE_TIM, TIM_OCPreload_Enable);
  125.     //使能TIM1預裝載寄存器
  126.     TIM_ARRPreloadConfig(MSD_PULSE_TIM, ENABLE);
  127.    
  128.     //設置中斷源,只有溢出時才中斷
  129.     TIM_UpdateRequestConfig(MSD_PULSE_TIM,TIM_UpdateSource_Regular);
  130.         // 清除中斷標志位
  131.         TIM_ClearITPendingBit(MSD_PULSE_TIM, TIM_IT_Update);
  132.     // 使能中斷
  133.     TIM_ITConfig(MSD_PULSE_TIM, TIM_IT_Update, ENABLE);
  134.         // 使能計數器
  135.         TIM_Cmd(MSD_PULSE_TIM, ENABLE);
  136. }
  137. /**

  138.   * @brief  初始化電機相關的外設

  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**********************/
復制代碼

  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為串口中斷調用函數,串口每收到一個數據,調用一次這個函數。
  14. //處理串口接收到的陀螺儀數據
  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) //數據頭不對,則重新開始尋找0x55數據頭
  22.         {
  23.                 ucRxCnt=0;
  24.                 return;
  25.         }
  26.         if (ucRxCnt<11) {return;}//數據不滿11個,則返回
  27.         else
  28.         {
  29.                 switch(ucRxBuffer[1])
  30.                 {
  31.                         case 0x50:        memcpy(&stcTime,&ucRxBuffer[2],8);break;//memcpy為編譯器自帶的內存拷貝函數,需引用"string.h",將接收緩沖區的字符拷貝到數據共同體里面,從而實現數據的解析。
  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. }
復制代碼


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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:741018 發表于 2020-5-20 20:30 來自手機 | 顯示全部樓層
有電路圖嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久成人免费一区二区 | 精品久| 亚洲永久 | 中文字幕在线观看成人 | 日韩三级在线 | 男人av在线| 国产精品伦一区二区三级视频 | 亚洲国产一区二区三区在线观看 | 久久久国产一区二区三区 | 91麻豆精品一区二区三区 | 亚洲国产精品99久久久久久久久 | 在线成人免费视频 | 欧美日韩1区2区3区 欧美久久一区 | 最近日韩中文字幕 | 一级网站 | 国产欧美一区二区三区国产幕精品 | 五月天婷婷丁香 | 天天操天天插天天干 | 国产精品久久国产精品 | 九九热在线视频免费观看 | 麻豆视频国产在线观看 | 天堂一区二区三区 | 久久久久久网站 | 成人欧美一区二区三区黑人孕妇 | 久久久99精品免费观看 | aaa综合国产 | 成人性视频免费网站 | 精品久久久久久久久久久久久久 | 国产一区二区三区网站 | 亚洲成人精品视频 | 久久精品国产亚洲 | 亚洲精品一区av在线播放 | 日韩1区 | 亚洲 中文 欧美 日韩 在线观看 | 久久久九九 | 超碰在线国产 | 国产一级片在线观看视频 | 在线不卡视频 | 亚av在线 | 久久国产免费看 | 91不卡在线 |