|
C#的上位機(jī)和STM32F103C8T6的下位機(jī),利用驅(qū)動器實現(xiàn)常見步進(jìn)電機(jī)的驅(qū)動,可以實現(xiàn)任意步數(shù)(65535以內(nèi))、方向的控制
51hei.png (8.42 KB, 下載次數(shù): 104)
下載附件
2022-3-6 21:07 上傳
單片機(jī)源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "adc.h"
- #include "crc.h"
- #include "timer.h"
- #include "exti.h"
- #define TIMES 5 //0.5 進(jìn)5次反轉(zhuǎn)一次
- #define INIT_STEPS1 500
- #define INIT_STEPS2 500
- #define INIT_STEPS3 500
- #define INIT_STEPS4 500
- #define INIT_STEPS5 500
- u16 StepNum[5]; //走的步數(shù)
- u8 Move_Flag[5]; //走不走
- u8 Move_Dir_Flag[5]; //走的方向
- u8 receive[20]; //接收的數(shù)據(jù)
- u8 send[20]; //發(fā)送的數(shù)據(jù)
- u16 crc;
- u8 k =0;
- u16 Total_times; //運行要走的來回數(shù)目;
- u8 Runing_flag; //運行的標(biāo)志位
- u16 Real_times;//運行真實走的次數(shù);
- u8 Init_flag; //初始化標(biāo)志位
- u8 Init_motor_num = 0; //初始化時逐一初始化
- //初始值始終為0
- u8 i; //定時器標(biāo)志位
- u8 j = 0; //每個電機(jī)的循環(huán)
- u16 Real_Step[5]; //實際走的步數(shù)
- u8 Res;
- u8 p=0;
- int main(void)
- {
- delay_init(); //延時函數(shù)初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
- uart_init(115200); //串口初始化為115200
- LED_Init(); //LED端口初始化
- Key_Init();
- send[0]=0x55;
- send[1]=0x02;
- ENA1 = 0;
- ENA2 = 0;
- ENA3 = 0;
- ENA4 = 0;
- ENA5 = 0;
- PWM1 = 1;
- PWM2 = 1;
- PWM3 = 1;
- PWM4 = 1;
- PWM5 = 1;
- EXTIX_Init();
- TIM3_Int_Init(4,799);//0.5ms進(jìn)一次定時器
-
- while(1)
- {
- delay_ms(1000);
- // PWM1=~PWM1;
- // PWM5=~PWM5;
- // PWM2=~PWM2;
- // PWM3=~PWM3;
- // PWM4=~PWM4;
- LED0=~LED0;
- }
- }
- //定時器3中斷服務(wù)程序
- void TIM3_IRQHandler(void) //TIM3中斷
- {
-
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發(fā)生與否
- {
- i++;
- if(i>=TIMES)
- {
- i=0;
- if(Init_flag !=0)
- {
- if(Init_flag ==1 )
- {
- switch(Init_motor_num)
- {
- case 1:
- if(PWM1 == 1)
- {
- PWM1=0;
- }
- else
- {
- PWM1=1;
- }
- break;
- case 2:
- if(PWM2 == 1)
- {
- PWM2=0;
- }
- else
- {
- PWM2=1;
- }
- break;
- case 3:
- if(PWM3 == 1)
- {
- PWM3=0;
- }
- else
- {
- PWM3=1;
- }
- break;
- case 4:
- if(PWM4 == 1)
- {
- PWM4=0;
- }
- else
- {
- PWM4=1;
- }
- break;
- case 5:
- if(PWM5 == 1)
- {
- PWM5=0;
- }
- else
- {
- PWM5=1;
- }
- break;
- }
-
- }
- else
- {
- switch(Init_motor_num)
- {
- case 1:
- if(PWM1 == 1)
- {
- PWM1=0;
- Real_Step[0]++;
- }
- else
- {
- PWM1=1;
- if(Real_Step[0]>=INIT_STEPS1) //走夠了
- {
- ENA1 = 0;
- ENA2 = 1;
- Real_Step[0]=0;
- Init_motor_num++;
- Init_flag = 1;
- }
- }
- break;
- case 2:
- if(PWM2 == 1)
- {
- PWM2=0;
- Real_Step[1]++;
- }
- else
- {
- PWM2=1;
- if(Real_Step[1]>=INIT_STEPS2) //走夠了
- {
- ENA2 = 0;
- ENA3 = 1;
- Real_Step[1]=0;
- Init_motor_num++;
- Init_flag = 1;
- }
- }
- break;
- case 3:
- if(PWM3 == 1)
- {
- PWM3=0;
- Real_Step[2]++;
- }
- else
- {
- PWM3=1;
- if(Real_Step[2]>=INIT_STEPS3) //走夠了
- {
- ENA3 = 0;
- ENA4 = 1;
- Real_Step[2]=0;
- Init_motor_num++;
- Init_flag = 1;
- }
- }
- break;
- case 4:
- if(PWM4 == 1)
- {
- PWM4=0;
- Real_Step[3]++;
- }
- else
- {
- PWM4=1;
- if(Real_Step[3]>=INIT_STEPS4) //走夠了
- {
- ENA4 = 0;
- ENA5 = 1;
- Real_Step[3]=0;
- Init_motor_num++;
- Init_flag = 1;
- }
- }
- break;
- case 5:
- if(PWM5 == 1)
- {
- PWM5=0;
- Real_Step[4]++;
- }
- else
- {
- PWM5=1;
- if(Real_Step[4]>=INIT_STEPS5) //走夠了
- {
- ENA5 = 0;
- Real_Step[4]=0;
- Init_motor_num = 0;
- Init_flag = 0;
- send[2]=0x02;
- send[3]=0x02;
- send[4] = 1;
- send[5] = 2;
- send[6] = 0xaa;
- send[7] = 0xbb;
- for(j=0;j<8;j++) //發(fā)送步數(shù)
- {
- USART_SendData(USART1, send[j]);//向串口1發(fā)送數(shù)據(jù)
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發(fā)送結(jié)束
- }
- }
- }
- break;
- }
- }
-
- }
- }
- else
- {
- if(Runing_flag==1) //運行
- {
- if(Move_Dir_Flag[0]==0) //走的方向
- DIR1 = 0;
- else
- DIR1 = 1;
- if(PWM1 == 1)
- {
- PWM1=0;
- Real_Step[0]++;
- }
- else
- {
- PWM1=1;
- if(Real_Step[0]>=StepNum[0]) //走夠了
- {
- Real_Step[0]=0;
- if(Move_Dir_Flag[0]==1) //走的方向
- Move_Dir_Flag[0] = 0;
- else
- {
- Move_Dir_Flag[0] = 1;
- Real_times++;
- send[2]=0x01;
- send[3]=0x02;
- send[4] = Real_times/256;
- send[5] = Real_times%256;
- send[6] = 0xaa;
- send[7] = 0xbb;
- for(j=0;j<8;j++) //發(fā)送步數(shù)
- {
- USART_SendData(USART1, send[j]);//向串口1發(fā)送數(shù)據(jù)
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發(fā)送結(jié)束
- }
- if(Real_times>=Total_times) //次數(shù)達(dá)到了
- {
- ENA1 = 0;
- Real_Step[0]=0;
- Runing_flag= 0;
- PWM1=1;
- }
- }
- }
- }
- }
- else
- {
- if(Move_Flag[0]==1) //1號電機(jī)要轉(zhuǎn)
- {
- if(Move_Dir_Flag[0]==0) //走的方向
- DIR1 = 0;
- else
- DIR1 = 1;
- if(PWM1 == 1)
- {
- PWM1=0;
- Real_Step[0]++;
- }
- else
- {
- PWM1=1;
- if(Real_Step[0]>=StepNum[0]) //走夠了
- {
- ENA1 = 0;
- Move_Flag[0] = 0;
- Real_Step[0]=0;
- StepNum[0] = 0;
-
- }
- }
- }
- if(Move_Flag[1]==1) //1號電機(jī)要轉(zhuǎn)
- {
- if(Move_Dir_Flag[1]==0) //走的方向
- DIR2 = 0;
- else
- DIR2 = 1;
- if(PWM2 == 1)
- {
- PWM2=0;
- Real_Step[1]++;
- }
- else
- {
- PWM2=1;
- if(Real_Step[1]>=StepNum[1]) //走夠了
- {
- ENA2 = 0;
- Move_Flag[1] = 0;
- Real_Step[1]=0;
- StepNum[1] = 0;
- }
- }
- }
- if(Move_Flag[2]==1) //1號電機(jī)要轉(zhuǎn)
- {
- if(Move_Dir_Flag[2]==0) //走的方向
- DIR3 = 0;
- else
- DIR3 = 1;
- if(PWM3 == 1)
- {
- PWM3=0;
- Real_Step[2]++;
- }
- else
- {
- PWM3=1;
- if(Real_Step[2]>=StepNum[2]) //走夠了
- {
- ENA3 = 0;
- Move_Flag[2] = 0;
- Real_Step[2]=0;
- StepNum[2] = 0;
- }
- }
- }
- if(Move_Flag[3]==1) //1號電機(jī)要轉(zhuǎn)
- {
- if(Move_Dir_Flag[3]==0) //走的方向
- DIR4 = 0;
- else
- DIR4 = 1;
- if(PWM4 == 1)
- {
- PWM4=0;
- Real_Step[3]++;
- }
- else
- {
- PWM4=1;
- if(Real_Step[3]>=StepNum[3]) //走夠了
- {
- ENA4 = 0;
- Move_Flag[3] = 0;
- Real_Step[3]=0;
- StepNum[3] = 0;
- }
- }
- }
- if(Move_Flag[4]==1) //1號電機(jī)要轉(zhuǎn)
- {
- if(Move_Dir_Flag[4]==0) //走的方向
- DIR5 = 0;
- else
- DIR5 = 1;
- if(PWM5 == 1)
- {
- PWM5=0;
- Real_Step[4]++;
- }
- else
- {
- PWM5=1;
- if(Real_Step[4]>=StepNum[4]) //走夠了
- {
- ENA5 = 0;
- Move_Flag[4] = 0;
- Real_Step[4]=0;
- StepNum[4] = 0;
- }
- }
- }
- }
- }
- }
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx更新中斷標(biāo)志
- }
- void USART1_IRQHandler(void) //串口1中斷服務(wù)程序
- {
- //1.緩沖數(shù)據(jù)
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾)
- {
- Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數(shù)據(jù)
- }
- receive[p++]=Res;
- //2.完整性判斷
- while(p>=6) //六個數(shù)據(jù)
- {
- //2.1查找數(shù)據(jù)頭
- if(receive[0]==0x55)
- {
- u8 len=receive[3];
- if(p<len+6)
- {
- break; //跳出接收函數(shù)后繼續(xù)接收數(shù)據(jù)
- }
- if(receive[len+4]==GetCRC16(receive,len+4)/256&&receive[len+5]==GetCRC16(receive,len+4)%256)//校驗成功
- {
- p=0;
- switch (receive[2])
- {
- case 0x01: //一個電機(jī)要動
- {
- Move_Flag[receive[4]-1] = 1; //走不走
- StepNum[receive[4]-1] = receive[5]*256+receive[6]; //走的步數(shù)
- Move_Dir_Flag[receive[4]-1]=receive[7]; //走的方向
- switch(receive[4])
- {
- case 1:
- ENA1 = 1;
- break;
- case 2:
- ENA2 = 1;
- break;
- case 3:
- ENA3 = 1;
- break;
- case 4:
- ENA4 = 1;
- break;
- case 5:
- ENA5 = 1;
- break;
- }
- break;
- }
- case 0x02: //多個電機(jī)動
- {
- for (j=0;j<5;j++)
- {
- Move_Flag[j] = 1; //走不走
- StepNum[j] = receive[3*j+4]*256+receive[3*j+5];
- Move_Dir_Flag[j] = receive[3*j+6]; //走的方向
- Real_Step[j] = 0;
- }
- ENA1 = 1;
- ENA2 = 1;
- ENA3 = 1;
- ENA4 = 1;
- ENA5 = 1;
- break;
- }
- case 0x03: //運行
- {
- StepNum[0] = receive[4]*256+receive[5];
- Total_times = receive[6]*256+receive[7];
- Move_Dir_Flag[0] = 1;
- Real_Step[0]=0;
- Runing_flag= 1;
- Real_times = 0;
- ENA1 = 1;
- break;
- }
- case 0x04: //初始化
- {
- Init_flag = 1; //初始化標(biāo)志位置1
- DIR1 = 0;//先向右走
- DIR2= 0;
- DIR3= 0;
- DIR4= 0;
- DIR5= 0;
- ENA1 = 1;
- Init_motor_num = 1;
- break;
- }
- case 0x05: //急停
- {
- PWM1= 1;
- Move_Flag[0] = 0; //走不走
- Real_Step[0] = 0;
- Runing_flag= 0;
- Real_times = 0;
- Init_flag = 0; //初始化標(biāo)志位置1
- ENA1 = 0;
- ENA2 = 0;
- ENA3 = 0;
- ENA4 = 0;
- ENA5 = 0;
- break;
- }
-
- }
- }
- else//校驗失敗
- {
- p=0;
- continue;
- }
-
- }
- else
- {
- //重新接收
- p=0;
- }
-
-
- }
- }
- //外部中斷2服務(wù)程序
- void EXTI2_IRQHandler(void)
- {
- if(Init_flag==1)
- {
- Init_flag = 2;
- switch(Init_motor_num)
- {
- case 1:
- PWM1 = 1;
- DIR1 = 1;
- Real_Step[0]=0;
- break;
- case 2:
- PWM2 = 1;
- DIR2 = 1;
- Real_Step[1]=0;
- break;
- case 3:
- PWM3 = 1;
- DIR3 = 1;
- Real_Step[2]=0;
- break;
- case 4:
- PWM4 = 1;
- DIR4 = 1;
- Real_Step[3]=0;
- break;
- case 5:
- PWM5 = 1;
- DIR5 = 1;
- Real_Step[4]=0;
- break;
- }
- }
- EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中斷標(biāo)志位
- }
復(fù)制代碼
51hei.png (9.79 KB, 下載次數(shù): 95)
下載附件
2022-3-6 21:09 上傳
51hei.png (5.67 KB, 下載次數(shù): 102)
下載附件
2022-3-6 21:09 上傳
所有資料51hei附件下載,僅供參考,切勿照搬:
3.2.1.7z
(491.04 KB, 下載次數(shù): 129)
2022-3-6 21:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|