stm32控制步進電機源碼:
0.png (57.44 KB, 下載次數: 93)
下載附件
2017-5-2 23:42 上傳
stm32單片機源程序:
- /*******************************************************************************
- * 文件名 : main.c
- * 作者 : jackice
- * 時間 :2013/8/10
- * 文件描述 : EN:PA.0 CLK:PA.1;DIR:PA.2
- ******兩個電機同時走動,可以通過給定不同頻率的脈沖、不同脈沖數達到兩個電機走速不同,走的距離不同************
- **********134個脈沖 電機走1mm;1345個脈沖 電機走10mm;13450個脈沖電機走100mm;******
- ********************************************************************************/
- /* 頭文件 ------------------------------------------------------------------*/
- #include "stm32f10x_lib.h"
- #define en0_0() GPIO_ResetBits(GPIOA , GPIO_Pin_0) //宏定義
- #define en0_1() GPIO_SetBits(GPIOA , GPIO_Pin_0)
- #define en1_0() GPIO_ResetBits(GPIOA , GPIO_Pin_4) //宏定義
- #define en1_1() GPIO_SetBits(GPIOA , GPIO_Pin_4)
- #define clk0_0() GPIO_ResetBits(GPIOA , GPIO_Pin_1)
- #define clk0_1() GPIO_SetBits(GPIOA , GPIO_Pin_1)
- #define clk1_0() GPIO_ResetBits(GPIOA , GPIO_Pin_5)
- #define clk1_1() GPIO_SetBits(GPIOA , GPIO_Pin_5)
- #define dir0_0() GPIO_ResetBits(GPIOA , GPIO_Pin_2)
- #define dir0_1() GPIO_SetBits(GPIOA , GPIO_Pin_2)
- #define dir1_0() GPIO_ResetBits(GPIOA , GPIO_Pin_3)
- #define dir1_1() GPIO_SetBits(GPIOA , GPIO_Pin_3)
- /* 自定義同義關鍵字 --------------------------------------------------------*/
- /* 自定義參數宏 --------------------------------------------------------*/
- /* 自定義函數宏 --------------------------------------------------------*/
- /* 自定義變量 --------------------------------------------------------*/
- /* 自定義函數聲明 --------------------------------------------------------*/
- void RCC_Configuration(void);
- void GPIO_Configuration(void);
- void delay(u32 i);
- void motor_contrl(u32 Xsteps,u8 Xdirection,u16 Xspeed,u32 Ysteps,u8 Ydirection,u16 Yspeed,u32 setps);
- /*******************************************************************************
- * 函數名 : main
- * 函數描述 : 無
- * 輸入參數 : 無
- * 輸出結果 : 無
- * 返回值 : 無
- *******************************************************************************/
- int main(void)
- {
-
- /* 設置系統時鐘 */
- RCC_Configuration();
- /* 設置GPIO端口 */
- GPIO_Configuration();
- /*打開使能端*/
- en0_1();
- en1_1();
- while(1)
- {
- motor_contrl(1,0,3,1,0,3,13450);
- delay(100000);
- motor_contrl(1,1,3,1,1,3,13450);
- delay(100000);
- }
- }
- /*******************************************************************************
- * 函數名 : RCC_Configuration
- * 函數描述 : 設置系統各部分時鐘
- * 輸入參數 : 無
- * 輸出結果 : 無
- * 返回值 : 無
- *******************************************************************************/
- void RCC_Configuration(void)
- {
- /* 定義枚舉類型變量 HSEStartUpStatus */
- ErrorStatus HSEStartUpStatus;
- /* 復位系統時鐘設置*/
- RCC_DeInit();
- /* 開啟HSE*/
- RCC_HSEConfig(RCC_HSE_ON);
- /* 等待HSE起振并穩定*/
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
-
- /* 判斷HSE起是否振成功,是則進入if()內部 */
- if(HSEStartUpStatus == SUCCESS)
- {
- /* 選擇HCLK(AHB)時鐘源為SYSCLK 1分頻 */
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
-
- /* 選擇PCLK2時鐘源為 HCLK(AHB) 1分頻 */
- RCC_PCLK2Config(RCC_HCLK_Div1);
- /* 選擇PCLK1時鐘源為 HCLK(AHB) 2分頻 */
- RCC_PCLK1Config(RCC_HCLK_Div2);
- /* 設置FLASH延時周期數為2 */
- FLASH_SetLatency(FLASH_Latency_2);
- /* 使能FLASH預取緩存 */
- FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
- /* 選擇鎖相環(PLL)時鐘源為HSE 1分頻,倍頻數為9,則PLL輸出頻率為 8MHz * 9 = 72MHz */
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
- /* 使能PLL */
- RCC_PLLCmd(ENABLE);
- /* 等待PLL輸出穩定 */
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
- /* 選擇SYSCLK時鐘源為PLL */
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- /* 等待PLL成為SYSCLK時鐘源 */
- while(RCC_GetSYSCLKSource() != 0x08);
- }
-
- /* 打開APB2總線上的GPIOA時鐘*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
- }
- /*******************************************************************************
- * 函數名 : GPIO_Configuration
- * 函數描述 : 設置各GPIO端口功能
- * 輸入參數 : 無
- * 輸出結果 : 無
- * 返回值 : 無
- *******************************************************************************/
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* 設置PA4,PA5,PA6,PA7口為推挽輸出,最大翻轉頻率為50MHz*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA , &GPIO_InitStructure);
- }
- /*******************************************************************************
- * 函數名 : delay
- * 函數描述 : 簡單延時
- * 輸入參數 : i
- * 輸出結果 : 無
- * 返回值 : 無
- *******************************************************************************/
- void delay(u32 k)
- {
- u32 j,i;
- for(i=k;i>0;i--)
- for(j=300;j>0;j--);
- }
- /*******************************************************************************
- * 函數名 : motor_contrl
- * 函數描述 : 電機控制,X和Y方向
- * 輸入參數 : Xsteps,Xdirection,Xspeed,Ysteps,Ydirection,Yspeed,u32 steps
- * 輸出結果 : 無
- * 返回值 : 無
- *******************************************************************************/
- void motor_contrl(u32 Xsteps,u8 Xdirection,u16 Xspeed,u32 Ysteps,u8 Ydirection,u16 Yspeed,u32 steps)
- {
- u32 step,Xstep,Ystep;
- if(Xdirection==1) //判斷向左還是向右
- {
- dir0_1(); //向右
- }
- else
- {
- dir0_0(); //向左
- }
- if(Ydirection==1) //判斷向上還是向下
- {
- dir1_1(); //向上
- }
- else
- {
- dir1_0(); //向下
- }
-
- for(step=steps;step>0;step--)
- {
- for(Xstep=Xsteps;Xstep>0;Xstep--) //給X軸電機脈沖數,控制X軸電機走的距離
- {
- clk0_0();
- delay(Xspeed); //給脈沖頻率,控制電機轉速,頻率越高速度越快,頻率越低速度越慢
- clk0_1();
- delay(Xspeed);
- for(Ystep=Ysteps;Ystep>0;Ystep--) //給Y軸電機脈沖數,控制Y軸電機走的距離
- {
- clk1_0();
- delay(Yspeed); //給脈沖頻率,控制電機轉速,頻率越高速度越快,頻率越低速度越慢
- clk1_1();
- delay(Yspeed);
- }
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整源碼下載:
dianji1.rar
(391.01 KB, 下載次數: 256)
2017-5-2 20:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|