ps2手柄控制 stm32f4zgt6芯片驅動麥克納姆輪資料
這里使用的是PWM調速來完成的,簡單的程序,資料和源碼在下面。
0.png (34.6 KB, 下載次數: 27)
下載附件
2018-10-10 14:49 上傳
麥克納姆輪3D圖紙:
5.png (29.16 KB, 下載次數: 34)
下載附件
2018-10-10 14:49 上傳
4.png (30.67 KB, 下載次數: 36)
下載附件
2018-10-10 14:49 上傳
3.png (32.15 KB, 下載次數: 28)
下載附件
2018-10-10 14:49 上傳
2.png (32.58 KB, 下載次數: 39)
下載附件
2018-10-10 14:49 上傳
1.png (33.26 KB, 下載次數: 34)
下載附件
2018-10-10 14:49 上傳
單片機源程序如下:
- #include <sys.h>
- #include <pwm.h>
- #include <delay.h>
- #include <usart.h>
- #include <pstwo.h>
- int main(void)
- {
- u16 L11=0;
- u16 L12=0;
- u16 L21=0;
- u16 L22=0;
- u16 R11=0;
- u16 R12=0;
- u16 R21=0;
- u16 R22=0;
- u8 key;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
- delay_init(168); //初始化延時函數
- uart_init(115200); //初始化串口波特率為115200
- PWM_init(500-1,84-1); //84M/84=1Mhz的計數頻率,重裝載值500,所以PWM頻率為 1M/500=2Khz.
- PS2_Init();
- PS2_SetInit();
-
- while(1)
- {
- key=PS2_DataKey();
- if(key!=0)
- {
- switch(key)
- {
- case 5: //前進
- {
- L11=300;
- L12=0;
- L21=300;
- L22=0;
- R11=300;
- R12=0;
- R21=300;
- R22=0;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 6: //右平移
- {
- L11=0;
- L12=300;
- L21=300;
- L22=0;
- R11=300;
- R12=0;
- R21=0;
- R22=300;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 8: //左平移
- {
- L11=300;
- L12=0;
- L21=0;
- L22=300;
- R11=0;
- R12=300;
- R21=300;
- R22=0;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 7: //后退
- {
- L11=0;
- L12=300;
- L21=0;
- L22=300;
- R11=0;
- R12=300;
- R21=0;
- R22=300;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 9: //逆時針旋轉
- {
- L11=0;
- L12=300;
- L21=0;
- L22=300;
- R11=300;
- R12=0;
- R21=300;
- R22=0;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 10: //順時針旋轉
- {
- L11=300;
- L12=0;
- L21=300;
- L22=0;
- R11=0;
- R12=300;
- R21=0;
- R22=300;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 13: //左前
- {
- L11=0;
- L12=0;
- L21=300;
- L22=0;
- R11=300;
- R12=0;
- R21=0;
- R22=0;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 14: //右前
- {
- L11=300;
- L12=0;
- L21=0;
- L22=0;
- R11=0;
- R12=0;
- R21=300;
- R22=0;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 16: //左后
- {
- L11=0;
- L12=0;
- L21=0;
- L22=300;
- R11=0;
- R12=300;
- R21=0;
- R22=0;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- case 15: //右后
- {
- L11=0;
- L12=300;
- L21=0;
- L22=0;
- R11=0;
- R12=0;
- R21=0;
- R22=300;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- break;
- }
- }
- else//停止
- {
- L11=0;
- L12=0;
- L21=0;
- L22=0;
- R11=0;
- R12=0;
- R21=0;
- R22=0;
- TIM_SetCompare1(TIM14,L11);
- TIM_SetCompare1(TIM13,L12);
- TIM_SetCompare1(TIM11,L21);
- TIM_SetCompare1(TIM10,L22);
- TIM_SetCompare1(TIM3,R11);
- TIM_SetCompare2(TIM3,R12);
- TIM_SetCompare3(TIM3,R21);
- TIM_SetCompare4(TIM3,R22);
- }
- delay_ms(50);
- }
- }
復制代碼
- #include "main.h"
- #include "PID.h"
- #include<stdio.h>
- #include<math.h>
- #include<systick.h>
- #include<main.h>
- #define Kp 10 //比例系數
- #define Ki 10 //積分系數
- #define Kd 0 //微分系數
- #define PID_MAX 12800
- uint8_t last_error; //上次誤差
- uint8_t last_error1; //上次誤差
- uint8_t last_error2; //上次誤差
- float I_term; //前面溫差和
- float I_term1; //前面溫差和
- float I_term2; //前面溫差和
- u16 PWMA_Num =0;
- u16 PWMB_Num =0;
- u16 PWMC_Num =0;
- //unsigned int out;//,PWMT;
- //unsigned int out1//,PWMT;
- int PID(int Set_value,int Real_value) //標準PID溫度控制算法
- {
- int error;
- float P_term, D_term;
- int pid_out;
- error=Set_value - Real_value; //誤差量
- //if(error<1000)
- //{
- P_term =Kp*error; //比例量
- I_term+=Ki*error; //積分量
- if(I_term>PID_MAX) I_term=PID_MAX; //限定積分量上限
- else if(I_term<0) I_term=0; //限定積分量下限
- D_term =Kd*(error - last_error); //微分量
- last_error=error; //緩存當前誤差量
- if(error<20)I_term=130;
- else I_term=0;
- pid_out=(signed int)(P_term+I_term+D_term); //PID控制量計算
-
- if(pid_out>PID_MAX) pid_out=PID_MAX; //控制量上限=PID_MAX
- else if(pid_out<0) pid_out=0; //控制量下限=0
- //return(pid_out);
- //}
- //else if(error>=1000) pid_out=12800;
-
- return(pid_out);
- }
- int PID1(int Set_value,int Real_value) //標準PID溫度控制算法
- {
- int error;
- float P_term, D_term;
- int pid_out;
- error=Set_value - Real_value; //誤差量
- //if(error<1000)
- //{
- P_term =Kp*error; //比例量
- I_term1+=Ki*error; //積分量
- if(I_term1>PID_MAX) I_term1=PID_MAX; //限定積分量上限
- else if(I_term1<0) I_term1=0; //限定積分量下限
- D_term =Kd*(error - last_error1); //微分量
- last_error1=error; //緩存當前誤差量
- if(error<20)I_term1=130;
- else I_term1=0;
- pid_out=(signed int)(P_term+I_term1+D_term); //PID控制量計算
-
- if(pid_out>PID_MAX) pid_out=PID_MAX; //控制量上限=PID_MAX
- else if(pid_out<0) pid_out=0; //控制量下限=0
- //return(pid_out);
- //}
- //else if(error>=1000) pid_out=12800;
-
- return(pid_out);
- }
- int PID2(int Set_value,int Real_value) //標準PID溫度控制算法
- {
- int error;
- float P_term, D_term;
- int pid_out;
- error=Set_value - Real_value; //誤差量
- //if(error<1000)
- //{
- P_term =Kp*error; //比例量
- I_term2+=Ki*error; //積分量
- if(I_term2>PID_MAX) I_term2=PID_MAX; //限定積分量上限
- else if(I_term2<0) I_term2=0; //限定積分量下限
- D_term =Kd*(error - last_error2); //微分量
- last_error2=error; //緩存當前誤差量
- if(error<20)I_term2=130;
- else I_term2=0;
- pid_out=(signed int)(P_term+I_term2+D_term); //PID控制量計算
-
- if(pid_out>PID_MAX) pid_out=PID_MAX; //控制量上限=PID_MAX
- else if(pid_out<0) pid_out=0; //控制量下限=0
- //return(pid_out);
- //}
- //else if(error>=1000) pid_out=12800;
-
- return(pid_out);
- }
- void jiare_pid_kongzhi(void)
- {
- uint16_t goal_temp=0;//目標溫度
- //PWMT=12800; //128級步進PWM控制
- //PID_MAX=PWMT;
- uint16_t out=0;
- I_term=0;
- last_error=0;
- if (WorkFaceDisBuff[10]==0)//現場測試華氏不加熱 增加溫度單位轉換 目標溫度是攝氏和華氏分開存放的 2017年12月6日 09:16:22
- {
- goal_temp = (WorkFaceDisBuff[3]+0)*100;//之前的是+3 會導致PWM值超過目標溫度值3度的時候才停止 可能需要PID數值才是正確方法 2017年11月30日 15:04:01
- }
- else
- {
- goal_temp = (WorkFaceDisBuff[11]+0)*100;//之前的是+3 會導致PWM值超過目標溫度值3度的時候才停止 可能需要PID數值才是正確方法 2017年11月30日 15:04:01
- }
- out=PID(goal_temp,WorkFaceDisBuff[4]); //PID程序
- PWMA_Num= (out/100); //PWM值
- }
- void jiare_pid_kongzhi1(void)
- {
- uint16_t goal_temp=0;//目標溫度
- //PWMT=12800; //128級步進PWM控制
- //PID_MAX=PWMT;
- uint16_t out=0;
- I_term1=0;
- last_error1=0;
-
- if (WorkFaceDisBuff[10]==0)//現場測試華氏不加熱 增加溫度單位轉換 目標溫度是攝氏和華氏分開存放的 2017年12月6日 09:16:22
- {
- goal_temp = (WorkFaceDisBuff[5]+0)*100;//之前的是+3 會導致PWM值超過目標溫度值3度的時候才停止 可能需要PID數值才是正確方法 2017年11月30日 15:04:01
- }
- else
- {
- goal_temp = (WorkFaceDisBuff[12]+0)*100;//之前的是+3 會導致PWM值超過目標溫度值3度的時候才停止 可能需要PID數值才是正確方法 2017年11月30日 15:04:01
- }
- out=PID1(goal_temp,WorkFaceDisBuff[6]); //PID程序
- PWMB_Num= (out/100); //PWM值
- }
- void jiare_pid_kongzhi2(void)
- {
- uint16_t goal_temp=0;//目標溫度
- // //PWMT=12800; //128級步進PWM控制
- // //PID_MAX=PWMT;
- // uint16_t out=0;
- // I_term2=0;
- // last_error2=0;
-
- if (WorkFaceDisBuff[10]==0)//現場測試華氏不加熱 增加溫度單位轉換 目標溫度是攝氏和華氏分開存放的 2017年12月6日 09:16:22
- {
- goal_temp = (WorkFaceDisBuff[7]+0)*100;//之前的是+3 會導致PWM值超過目標溫度值3度的時候才停止 可能需要PID數值才是正確方法 2017年11月30日 15:04:01
- }
- else
- {
- goal_temp = (WorkFaceDisBuff[13]+0)*100;//之前的是+3 會導致PWM值超過目標溫度值3度的時候才停止 可能需要PID數值才是正確方法 2017年11月30日 15:04:01
- }
- // out=PID1(goal_temp,WorkFaceDisBuff[8]); //PID程序
- // PWMC_Num= (out/100); //PWM值
- if (goal_temp>WorkFaceDisBuff[8])//將PWM轉化為開關量了 因為C路是繼電器控制的
- {
- PWMC_Num=129;//永遠大于128
- }
- else
- {
- PWMC_Num=0;
- }
- }
復制代碼
所有資料51hei提供下載:
2018.9.28 TIM3backup.rar
(459.3 KB, 下載次數: 76)
2018-10-10 14:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
納姆車資料 STM32源碼+3D圖紙.7z
(4.45 MB, 下載次數: 99)
2018-10-10 11:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|