大家想學步進電機用stm32控制步進電機可以借鑒下啊
單片機源程序如下:
- #include "stm32f10x.h"
- #include "stm32f10x_rcc.h"
- #include "misc.h"
- void RCC_Configuration(void);
- void GPIO_Configuration(void);
- void ZhengZhuan(u16 tt);
- void FanZhuan(u16 tt);
- void delay_ms(u16 nms);
- /****************************************************************************
- * 名 稱:int main(void)
- * 功 能:主函數
- * 入口參數:無
- * 出口參數:無
- * 說 明:
- * 調用方法:無
- ****************************************************************************/
- int main(void)
- {
- RCC_Configuration(); //系統時鐘設置及外設時鐘使能
- GPIO_Configuration();
- while (1)
- {
- //讀取PC5管腳的輸入狀態 K1
- if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) == Bit_RESET)
- {
- ZhengZhuan(5);//高速
- }
- //讀取PC5管腳的輸入狀態 K2
- if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) == Bit_RESET)
- {
- FanZhuan(5);//高速
- }
- //讀取PC2管腳的輸入狀態 K3
- if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == Bit_RESET)
- {
- ZhengZhuan(10);//低速
- }
- //讀取PC3管腳的輸入狀態 K4
- if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) == Bit_RESET)
- {
- FanZhuan(10);//低速
- }
- GPIO_ResetBits(GPIOD, GPIO_Pin_3);
- GPIO_ResetBits(GPIOD, GPIO_Pin_6);
- GPIO_ResetBits(GPIOD, GPIO_Pin_12);
- GPIO_ResetBits(GPIOE, GPIO_Pin_4);
- }
- }
- /****************************************************************************
- * 名 稱:void RCC_Configuration(void)
- * 功 能:系統時鐘配置為72MHZ, 外設時鐘配置
- * 入口參數:無
- * 出口參數:無
- * 說 明:
- * 調用方法:無
- ****************************************************************************/
- void RCC_Configuration(void)
- {
- SystemInit();
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE , ENABLE);
- }
- /****************************************************************************
- * 名 稱:void GPIO_Configuration(void)
- * 功 能:LED控制口線及鍵盤設置
- * 入口參數:無
- * 出口參數:無
- * 說 明:
- * 調用方法:無
- ****************************************************************************/
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //端口配置結構體
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PD3管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口線翻轉速度為50MHz
- GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PD6管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口線翻轉速度為50MHz
- GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PD12管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口線翻轉速度為50MHz
- GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PE4管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口線翻轉速度為50MHz
- GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PC5管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PC1管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PC2管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PC3管腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化端口
- }
- //電機正轉函數
- void ZhengZhuan(u16 tt)
- {
- //1100
- GPIO_SetBits(GPIOD, GPIO_Pin_3);
- GPIO_SetBits(GPIOD, GPIO_Pin_6);
- GPIO_ResetBits(GPIOD, GPIO_Pin_12);
- GPIO_ResetBits(GPIOE, GPIO_Pin_4);
- delay_ms(tt);
- //0110
- GPIO_ResetBits(GPIOD, GPIO_Pin_3);
- GPIO_SetBits(GPIOD, GPIO_Pin_6);
- GPIO_SetBits(GPIOD, GPIO_Pin_12);
- GPIO_ResetBits(GPIOE, GPIO_Pin_4);
- delay_ms(tt);
- //0011
- GPIO_ResetBits(GPIOD, GPIO_Pin_3);
- GPIO_ResetBits(GPIOD, GPIO_Pin_6);
- GPIO_SetBits(GPIOD, GPIO_Pin_12);
- GPIO_SetBits(GPIOE, GPIO_Pin_4);
- delay_ms(tt);
- //1001
- GPIO_SetBits(GPIOD, GPIO_Pin_3);
- GPIO_ResetBits(GPIOD, GPIO_Pin_6);
- GPIO_ResetBits(GPIOD, GPIO_Pin_12);
- GPIO_SetBits(GPIOE, GPIO_Pin_4);
- delay_ms(tt);
- }
- //電機反轉函數
- void FanZhuan(u16 tt)
- {
- //1001
- GPIO_SetBits(GPIOD, GPIO_Pin_3);
- GPIO_ResetBits(GPIOD, GPIO_Pin_6);
- GPIO_ResetBits(GPIOD, GPIO_Pin_12);
- GPIO_SetBits(GPIOE, GPIO_Pin_4);
- delay_ms(tt);
- //0011
- GPIO_ResetBits(GPIOD, GPIO_Pin_3);
- GPIO_ResetBits(GPIOD, GPIO_Pin_6);
- GPIO_SetBits(GPIOD, GPIO_Pin_12);
- GPIO_SetBits(GPIOE, GPIO_Pin_4);
- delay_ms(tt);
- //0110
- GPIO_ResetBits(GPIOD, GPIO_Pin_3);
- GPIO_SetBits(GPIOD, GPIO_Pin_6);
- GPIO_SetBits(GPIOD, GPIO_Pin_12);
- GPIO_ResetBits(GPIOE, GPIO_Pin_4);
- delay_ms(tt);
- //1100
- GPIO_SetBits(GPIOD, GPIO_Pin_3);
- GPIO_SetBits(GPIOD, GPIO_Pin_6);
- GPIO_ResetBits(GPIOD, GPIO_Pin_12);
- GPIO_ResetBits(GPIOE, GPIO_Pin_4);
- delay_ms(tt);
- }
- void delay_ms(u16 nms)
- {
- u32 temp;
- SysTick->LOAD = 9000*nms;
- SysTick->VAL=0X00;//清空計數器
- SysTick->CTRL=0X01;//使能,減到零是無動作,采用外部時鐘源
- do
- {
- temp=SysTick->CTRL;//讀取當前倒計數值
- }while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達
- SysTick->CTRL=0x00; //關閉計數器
- SysTick->VAL =0X00; //清空計數器
- }
復制代碼
所有資料51hei提供下載:
程序.rar
(270.59 KB, 下載次數: 107)
2018-11-16 03:12 上傳
點擊文件名下載附件
|