标题:
基于stm32f103zet6+MPU6050的风板控制系统源程序
[打印本页]
作者:
queen1210
时间:
2019-7-28 15:06
标题:
基于stm32f103zet6+MPU6050的风板控制系统源程序
系统采用stm32f103ZET6作为控制器,使用MPU6050作为角度反馈,通过位置式PID控制风板到任意角度。欢迎技术交流。联系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
/************************************************
风机:左(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(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
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
}
}
复制代码
所有资料51hei提供下载:
风板控制.7z
(202.54 KB, 下载次数: 92)
2019-7-28 18:24 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
xiaozhong1314
时间:
2019-7-28 19:15
谢谢分享
作者:
hjbhb
时间:
2019-7-31 20:30
为什么没有定义IIC协议呢
作者:
guoliang123
时间:
2019-7-31 23:34
你的程序对吗?
作者:
QI0609
时间:
2019-8-21 13:25
hjbhb 发表于 2019-7-31 20:30
为什么没有定义IIC协议呢
她用都rxtx
作者:
pz5200
时间:
2019-8-22 08:55
感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1