標(biāo)題:
基于stm32f103zet6+MPU6050的風(fēng)板控制系統(tǒng)源程序
[打印本頁]
作者:
queen1210
時間:
2019-7-28 15:06
標(biāo)題:
基于stm32f103zet6+MPU6050的風(fēng)板控制系統(tǒng)源程序
系統(tǒng)采用stm32f103ZET6作為控制器,使用MPU6050作為角度反饋,通過位置式PID控制風(fēng)板到任意角度。歡迎技術(shù)交流。聯(lián)系1194735786.
單片機源程序如下:
#include "led.h"
#include "key.h"
#include "timer.h"
#include "contral.h"
#include "oled.h"
#include "mpu6050.h"
#include "beep.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#define PWM_INT 3000
/************************************************
風(fēng)機:左(PA6) 右(PA7)
OLED GND 電源地
VCC 接5V或3.3v電源
D0 接PD6(SCL) KEY0: PEin(4) //PE4
D1 接PD7(SDA) KEY1: PEin(3) //PE3
RES 接PD4 WK_UP: PAin(0) //PA0 WK_UP
DC 接PD5 BEEP: PBout(8)
CS 接PD3
陀螺儀 TX:PA10 LED0:PB5
RX:PA9 LED1: PE5
************************************************/
/***********全局變量**************/
vu8 key=0;
int fengji_zuo,fengji_you;
u16 led0pwmval=0,ax;
u8 dir=1;
int pwm_left,pwm_right;
int ek;
void pid_ctrl(u16 kp,u16 kd,int experd)
{
// int exp;
// if(experd<0)
// exp = experd -0;
// else if(experd <15)
// exp = experd -0;
// else
// exp = experd +0;
ek = experd - angle[0];
if(ek < 0)
{
pwm_left = PWM_INT + kp*ek + kd*w[0];
pwm_right= PWM_INT - kp*ek - kd*w[0];
}
else
{
pwm_left = PWM_INT + kp*ek + kd*w[0];
pwm_right= PWM_INT - kp*ek - kd*w[0];
}
//low_data
if(pwm_left < 1500)
pwm_left = 1500;
else
pwm_left = pwm_left;
if(pwm_right < 1500)
pwm_right = 1500;
else
pwm_right = pwm_right;
//hight_data
if(pwm_left > 7200)
pwm_left = 7200;
else
pwm_left = pwm_left;
if(pwm_right > 7200)
pwm_right = 7200;
else
pwm_right = pwm_right;
}
int main(void)
{
delay_init(); //延時函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
uart_init(115200); //串口初始化為115200
LED_Init(); //LED端口初始化
OLED_Init(); //OLED???
OLED_Clear(); //??
BEEP_Init(); //初始化蜂鳴器端口
KEY_Init(); //初始化與按鍵連接的硬件接口
TIM3_PWM_Init(7199,0); //不分頻。PWM頻率=72000000/7200=10Khz
OLED_ShowCHinese(00,0,1); //加
OLED_ShowCHinese(16,0,2); //速
OLED_ShowCHinese(32,0,3); //度
OLED_ShowCHinese(00,2,0); //角
OLED_ShowCHinese(16,2,2); //速
OLED_ShowCHinese(32,2,3); //度
OLED_ShowCHinese(00,4,0); //角
OLED_ShowCHinese(16,4,3); //度
while(1)
{
mpu6050();
key_tihao();
/*************PID********************/
pid_ctrl(400,5,exp_set);
OLED_ShowNum(72,0,a[0],3,16);
OLED_ShowNum(72,2,w[0],3,16);
TIM_SetCompare1(TIM3,pwm_left ); // pwm_left 2100
TIM_SetCompare2(TIM3,pwm_right); // pwm_right
if(w[0] < 0)
{
OLED_ShowChar(64,2,'-');
OLED_ShowNum(72,2,-w[0],3,16);
}
else
{
OLED_ShowChar(64,2,' ');
OLED_ShowNum(72,2,w[0],3,16);
}
/************角度顯示******************/
if(angle[0] < 0)
{
OLED_ShowChar(48,4,'-');
ax = -angle[0];
OLED_ShowNum(64,4,-angle[0],3,16);
}
else
{
OLED_ShowChar(48,4,' ');
OLED_ShowNum(64,4,angle[0],3,16);
}
if(exp_set < 0)
{
OLED_ShowChar(96,4,'-');
OLED_ShowNum(102,4,-exp_set,3,16);
}
else
{
OLED_ShowChar(96,4,' ');
OLED_ShowNum(102,4,exp_set,3,16);
}
OLED_ShowNum(0,6,pwm_left,4,16);
OLED_ShowNum(72,6,pwm_right,4,16);
/************************************/
// delay_ms(10);
//
// if(dir)led0pwmval++;
// else led0pwmval--;
// if(led0pwmval>36000)dir=0;
// if(led0pwmval==0)dir=1;
// TIM_SetCompare1(TIM3,led0pwmval);
// TIM_SetCompare2(TIM3,led0pwmval);
// LED1=1;
// delay_ms(300); //延時300ms
// LED1=0;
// delay_ms(300); //延時300ms
}
}
復(fù)制代碼
所有資料51hei提供下載:
風(fēng)板控制.7z
(202.54 KB, 下載次數(shù): 92)
2019-7-28 18:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
xiaozhong1314
時間:
2019-7-28 19:15
謝謝分享
作者:
hjbhb
時間:
2019-7-31 20:30
為什么沒有定義IIC協(xié)議呢
作者:
guoliang123
時間:
2019-7-31 23:34
你的程序?qū)幔?br />
作者:
QI0609
時間:
2019-8-21 13:25
hjbhb 發(fā)表于 2019-7-31 20:30
為什么沒有定義IIC協(xié)議呢
她用都rxtx
作者:
pz5200
時間:
2019-8-22 08:55
感謝分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1