標題:
STM32F103C8T6單片機蹺蹺板平衡車程序,MPU6050,PID
[打印本頁]
作者:
Edison丶DF
時間:
2019-7-21 15:07
標題:
STM32F103C8T6單片機蹺蹺板平衡車程序,MPU6050,PID
STM32F103C8T6,蹺蹺板平衡車,MPU6050,PID
元件清單:
OLED顯示屏
STM32F103C8T6最小系統(tǒng)
MPU6050陀螺儀
TB6612FNG驅動模塊
LM2596穩(wěn)壓
12V鋰電池
直流減速電機帶編碼器*2
紅外循跡探頭*5
37mm直流減速電機固定座 鐵質*2
65mm輪胎*2
鐵質 連軸器*2
杜邦線若干
萬向輪
銅柱
洞洞板
單片機源程序如下:
#include "stm32f10x.h"
#include "sys.h"
char x[10];//角度顯示緩沖數(shù)組
u8 Tim[7]= "Time : ";//時間顯示數(shù)組
extern float Roll; //讀取到的6050角度值
float Roll_1,Roll_2,Roll_3;//分別是最新時刻角度值,上一時刻角度值,以及積分角度值
float power;//小車最終輸出動力
float KP=8.0,KD=0.5,KI=0.02,PrevError_C =0;//PID參數(shù)
u8 pid_flag=0;//分時刻讀取角度值的標志位
extern u16 tim_flag;//計時標志位
extern int tim;//秒計時,一秒加一
double zz=0;//平衡計時
int main()//主函數(shù)
{
delay_init();//延時函數(shù)初始化
IIC_Init();//IIC初始化
MPU6050_initialize();//6050初始化
DMP_Init();//MPU6050內置DMP的初始化
OLED_Init();//OLED初始化
OLED_Clear();//OLED清屏
GPIO_INIT();//控制減速電機IO口初始化
HW_INIT();//紅外探頭使用IO口初始化
TIM3_INIT();//定時器初始化,用于放PWM波,控制車的速度
Qianjin();//使車向前跑(相對的)
TIM3->CCR1=80;//左輪動力80
TIM3->CCR2=80;//右輪動力80
OLED_ShowString(0,4, Tim);//OLED顯示不改變數(shù)組
Read_DMP();//讀取一次角度值
while(1)//無限循環(huán)
{
sprintf(x,"Angle: %0.2f",Roll);//此函數(shù)用于將數(shù)組加入可變參數(shù)
OLED_ShowString(0,0,(u8*)x);//顯示上列數(shù)組
if(tim>=99)tim=99;//計時上限99秒
OLED_ShowNum(48,4,tim,3,12);//顯示時間,單位/秒
OLED_ShowNum(0,6,zz,4,12);//顯示平衡時間
OLED_ShowNum(32,6,power,4,12);//顯示當前動力值
/***************************平衡PID算法********************************/
pid_flag++;//運行時間標志
if(pid_flag==1)//記錄1時刻角度值
{
Roll_1=Roll;
}
if(pid_flag==2)//記錄2時刻角度值
{
pid_flag=0;
Roll_2=Roll;
PrevError_C=Roll_2-Roll_1;//兩次角度的差值
}
Read_DMP();//讀取當前角度值
Roll_3+=Roll;//積分值累加
power=KP*abs(Roll)+KI*abs(Roll_3)+KD*PrevError_C;//PID計算當前合適的動力值
if(power>90) power=90;//動力值限幅
if(Roll>1.7)//判斷角度值
{
if(PrevError_C<-0.03)//預判是否需要后退
Qianjin();
else //不需要就繼續(xù)走
Houtui();
TIM3->CCR1=power+30;
TIM3->CCR2=power;
}
if(Roll<-1.7) //判斷角度值
{
if(PrevError_C>0.03)//預判是否需要后退
Houtui();
else //不需要就繼續(xù)走
Qianjin();
TIM3->CCR1=power+20;
TIM3->CCR2=power;
}
if((Roll<=1.7)&&(Roll>=-1.7)&&(PrevError_C<0.03&&PrevError_C>-0.03))//平衡條件限定
{
Tingzhi();//停止
TIM3->CCR1=0;//動力值為0
TIM3->CCR2=0;
Roll_3=0; //積分清零
zz++;//平衡計時
if(zz>888)//達到平衡時間觀察
{
while(1)
{
Qianjin();TIM3->CCR1=95;TIM3->CCR2=80;//勻速向前
if(HW5==0)//右后探頭檢測到黑線
{
Tingzhi();//停止
while(1)
{
Tingzhi();
TIM3->CCR1=0;//動力為0
TIM3->CCR2=0;
}
}
}
}
}
}
}
復制代碼
所有資料51hei提供下載:
project+注釋.7z
(68.97 KB, 下載次數(shù): 183)
2019-7-21 15:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
aaaaaa。
時間:
2019-7-23 10:09
學習一下
作者:
gvin
時間:
2019-7-24 12:48
親請問 有接線圖么
作者:
sf116
時間:
2019-7-24 15:12
學習下,謝謝
作者:
溫存723
時間:
2021-4-17 13:40
你好 ,可以發(fā)一下實物圖么? 看到可以與我聯(lián)系,非常感謝。
作者:
woyaodwn
時間:
2021-12-28 10:06
有電路原理圖,源碼嗎
作者:
51初學者15
時間:
2022-2-12 10:52
woyaodwn 發(fā)表于 2021-12-28 10:06
有電路原理圖,源碼嗎
找到源代碼了嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1