资源简介
本工程是基于51单片机,里面包含PWM,PID,卡尔曼滤波等程序资料,程序是本人课程设计写的,非常适合新手学习。
代码片段和文件信息
#include “STC12C5A60S2.h“
#include “IIC.h“
#include “kaermanlvbo.h“
#include “MPU6050.h“
#include “DIANJI.h“
#define uint unsigned int
#define uchar unsigned char
int speed_mr; //右电机转速
int speed_ml; //左电机转速
int PWM_R; //右轮PWM值计算
int PWM_L; //左轮PWM值计算
float PWM; //综合PWM计算
float PWMI; //PWM积分值
float speed_r_l; //电机转速
float speed; //电机转速滤波
float position; //位移
uchar t=0;
void delay(uint z)
{
uint xy;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Init_Timer1(void) //10毫秒@12MHz100Hz刷新频率
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD&=0x0f;
TMOD|=0x10; //设置定时器模式
TL1 = 0xF0; //设置定时初值
TH1 = 0xD8; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
void Init_Interr(void)
{
EA = 1; //开总中断
EX0 = 1; //开外部中断INT0
EX1 = 1; //开外部中断INT1
IT0 = 1; //下降沿触发
IT1 = 1; //下降沿触发
ET1 = 1; //开定时器1中断
}
void Psn_Calcu(void) //电机转速和位移值计算
{
speed_r_l =(speed_mr + speed_ml)*0.5;
speed *= 0.7; //车轮速度滤波
speed += speed_r_l*0.3;
position += speed; //积分得到位移
if(position<-6000) position = -6000;
if(position> 6000) position = 6000;
}
static float code Kp = 9; //PID参数
static float code Kd = 2.6; //PID参数
static float code Kpn = 0.01; //PID参数
static float code Ksp = 2.0; //PID参数
void PWM_Calcu(void) //电机PWM值计算
{
if(angle<-40||angle>40) //角度过大,关闭电机
{
CCAP0H = 0;
CCAP1H = 0;
return;
}
PWM = Kp*angle + Kd*gyro_y; //PID:MPU6050角速度和角度
PWM += Kpn*position + Ksp*speed; //PID:电机速度和位置
PWM_R = PWM;
PWM_L = PWM;
pwm_dianji(PWM_LPWM_R);
}
void main()
{
delay(500); //上电延时
init_pwm(); //PWM初始化
init_timer0(); //初始化定时器0,作为PWM时钟源
Init_Timer1(); //初始化定时器1
Init_Interr(); //中断初始化
init_dianji(); //电机控制初始化
init_mpu6050();
delay(500);
while(1)
{
}
}
//********timer1中断***********************
void Timer1_Update(void) interrupt 3
{
TL1 = 0xF0; //设置定时初值 10ms
TH1 = 0xD8; //设置定时初值
angle_calcu(); //倾角计算
Psn_Calcu(); //电机位移计算
PWM_Calcu(); //计算PWM值
speed_mr = speed_ml = 0;
}
//********右电机中断***********************
void INT_L(void) interrupt 0
{
if(SPDL == 1) { speed_ml++; } //左电机前进
else { speed_ml--; } //左电机后退
}
//********左电机中断***********************
void INT_R(void) interrupt 2
{
if(SPDR == 1) { speed_mr++; } //右电机前进
else { speed_mr--; } //右电机后退
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2016-01-19 18:22 小车平衡总程序\
文件 647 2015-06-13 15:51 小车平衡总程序\DIANJI.h
文件 667 2015-05-27 20:55 小车平衡总程序\DINGYI.h
文件 1632 2015-05-31 11:17 小车平衡总程序\IIC.h
文件 1186 2015-05-27 19:56 小车平衡总程序\LCD1206.h
文件 1201 2015-05-31 15:20 小车平衡总程序\MPU6050.h
文件 499 2015-06-07 14:11 小车平衡总程序\PWM.h
文件 17735 2015-05-20 15:19 小车平衡总程序\STC12C5A60S2.h
文件 574 2015-05-31 08:18 小车平衡总程序\init.h
文件 1551 2015-06-13 15:48 小车平衡总程序\kaermanlvbo.h
文件 25630 2015-06-13 15:51 小车平衡总程序\小车平衡总程序
文件 6485 2015-06-13 15:51 小车平衡总程序\小车平衡总程序.LST
文件 28326 2015-06-13 15:51 小车平衡总程序\小车平衡总程序.M51
文件 30316 2015-06-13 15:51 小车平衡总程序\小车平衡总程序.OBJ
文件 2948 2015-06-13 15:48 小车平衡总程序\小车平衡总程序.c
文件 10713 2015-06-13 15:51 小车平衡总程序\小车平衡总程序.hex
文件 60 2015-06-13 15:51 小车平衡总程序\小车平衡总程序.lnp
文件 0 2016-01-19 18:22 小车平衡总程序\小车平衡总程序.plg
文件 74516 2016-01-19 18:22 小车平衡总程序\小车平衡总程序.uvgui.huahui
文件 74338 2015-05-31 08:49 小车平衡总程序\小车平衡总程序.uvgui_huahui.bak
文件 8358 2016-01-19 18:22 小车平衡总程序\小车平衡总程序.uvopt
文件 14495 2016-01-19 18:22 小车平衡总程序\小车平衡总程序.uvproj
文件 58852 2015-06-13 15:51 小车平衡总程序\小车平衡总程序_uvopt.bak
文件 14491 2015-05-31 08:20 小车平衡总程序\小车平衡总程序_uvproj.bak
- 上一篇:安卓智能语音助手源代码
- 下一篇:用labview写的CRC校验
相关资源
- STC15F2K60S2 iic 驱动程序
- 微信小程序之小米商城
- p2p-test[udp打洞测试程序].zip
- SiI9134配置完整程序,单片机上已测试
- 基于51单片机的RFID智能门禁系统源码
- 基于51单片机的电子密码锁源码+电路
- 51单片机超声波测距数码管显示
- 51单片机超声波测距1602LCD显示
- C8051F005手机震动马达测试程序
- 1602电子时钟万年历isis仿真文件,程序
- 51单片机+tlc5615+信号发生器正弦波 方
- 电能收集充电器 51单片机实现
- 篮球计分器protues仿真+C程序
- 西门子PLC S7-200 300程序范例
- 智能电饭煲程序
- linux为服务器,Windows为客户端的简单
- SHT75温湿度气压传感器驱动程序
- 英文打字练习程序 文章 单词 练习
- 51单片机超声波测距HC-SR04程序
- 74HC4511七段译码器的资料
- ILI9486TFT驱动程序C51
- NRF905无线PC控制台操作界面及单片机程
- HB12864M2A串行程序
- C8051F410A/D转换程序
- 信捷PLC的Modbus TCP通信程序,同时跟
- 程序员实习报告;实习报告
- 自动安装程序生成器
- 无刷无感电机驱动源程序
- 51单片机小车巡线L298N驱动
- 你比我猜游戏程序
评论
共有 条评论