【stm32】单片机学习——小车的开环控制
项目要求:
项目分析:
整个过程是开环的,意味着我们需要提前计算好小车在每一个段的左右轮的速度与运行的时间。
整个问题的关键是计算每一段的速度:
于是我们得出解决这个问题的步骤:
项目解决过程:
1.matlab进行数学建模:
思路:
把这个曲线分成20份直线(不能太多:会慢;也不能太少:会掉下去),计算相邻两个直线之间的夹角
我们的小车就相当于走了20次直线运动加18次转向。
theta数组记录的是每次转向的角度。
我们只需计算小车转相应角度的占功比加直线运动的速度。
把计算好的数据导入小车。
理论上就可以完成任务了。
代码实现(matlab):
a=0.4
l=0.4
%单位:米
l=0.4;
a=0.4;
u=linspace(0,pi,20);
rx=[];
ry=[];
theta=[]
for i=1:20rx(end+1)=-2*a*( ( l-cos(u(i)) ) * cos(u(i)) + (1-l) );ry(end+1)=2*a*(l-cos(u(i)))*sin(u(i));
end
plot(rx,ry)%X,Y对u的一阶导数
X_1=[];
Y_1=[];
X_1=diff(rx)./diff(u)
Y_1=diff(ry)./diff(u)
根据:T=
%计算T
T_X=[];
T_Y=[];
for i=1:19dis=sqrt(X_1(i)*X_1(i)+Y_1(i)*Y_1(i));T_X(end+1)=X_1(i)/dis;T_Y(end+1)=Y_1(i)/dis;
end
T_X
T_Ythe torsion:
k=
T_X1=diff(T_X)./diff(u(1:end-1));
T_Y1=diff(T_Y)./diff(u(1:end-1));k=[];
for i=1:18disT=sqrt(T_X1(i)*T_X1(i)+T_Y1(i)*T_Y1(i));disR=sqrt(X_1(i)*X_1(i)+Y_1(i)*Y_1(i));k(end+1)=disT/disR;
end
k=[1.0./k];
krx1=diff(rx)./diff(u);
ry1=diff(ry)./diff(u);
%将轨迹切成一段一段的直线:
for i=2:19clf;hold on;axis equal;plot(rx,ry)dx1=rx(i+1)-rx(i);dy1=ry(i+1)-ry(i);dx2=rx(i)-rx(i-1);dy2=ry(i)-ry(i-1);quiver(rx(i),ry(i),dx1,dy1,'Color',[1.0,0.0,0.0],'LineWidth',3.0);theta(end+1)=judge(dx2,dy2,dx1,dy1);theta(end)legend('路径','直线运动的方向');drawnow
endL=[];tot=0;
for i=1:19dx=rx(i+1)-rx(i);dy=ry(i+1)-ry(i);L(end+1)=sqrt(dx*dx+dy*dy);tot=tot+L(end);
end
L
rx
ry
theta
totfunction theta=judge(x1,y1,x2,y2)len1=sqrt(x1*x1+y1*y1);len2=sqrt(x2*x2+y2*y2);dc=x1*x2+y1*y2;theta=acos(dc/(len1*len2));
end
最后我们得到数学建模后的结果:
2.运用切线法计算出每一段的曲率与长度:
长度的计算: dl=sqrt(dx2+dy2)dl=sqrt(dx^2+dy^2)dl=sqrt(dx2+dy2)
曲率的计算: 曲率:k 单位切向量:T 位移方程:r(x)
于是我们由这些公式就得到了曲线各段的曲率与长度:
曲率:
长度:
3.测量小车在不同pwm下的速度:
这里不同的小车的状况不同,我们就只展示一部分数据:
4.将pwm,t的值带入小车单片机中
计算pwm与t
根据公式:
我们将数据带入程序中:
代码(C++)
#include<bits/stdc++.h>
using namespace std;
#define H 500005
#define LL long long
const double v=0.93;//米每秒
const double d=0.17;//两轮之间的距离
double Len[20]={0, 0.0791 , 0.0815 , 0.0859 , 0.0921 , 0.0995 , 0.1076 , 0.1162 , 0.1249 , 0.1336 , 0.1419, 0.1497 , 0.1570 , 0.1636 , 0.1694 , 0.1743 , 0.1783 , 0.1813 , 0.1834 , 0.1844
};
double theta[20]={0, 0.4354 , 0.4204 , 0.4004 , 0.3795 , 0.3605 , 0.3442 , 0.3308 , 0.3201 , 0.3114 , 0.3046,0.2991 , 0.2948 , 0.2914 , 0.2887 , 0.2867 , 0.2852 , 0.2842 , 0.2836 , 0
};
double R[19]={0, 0.1832 , 0.1953 , 0.2161 , 0.2441 , 0.2774 , 0.3142 , 0.3529 , 0.3921 , 0.4306 , 0.4676,0.5025 , 0.5345 , 0.5633 , 0.5886 , 0.6100 , 0.6273 , 0.6403 , 0.6489
};
double Lv[20],Rv[20];//左轮pwm与右轮pwm
double t[20];//每一段的时间
int main(){//计算时间 for(int i=1;i<=19;i++)t[i]=Len[i]/v;//计算pwm for(int i=1;i<=18;i++){Lv[i]=v-d/2*(v/R[i]);Rv[i]=v+d/2*(v/R[i]);Lv[i]=ceil(Lv[i]*4000);Rv[i]=ceil(Rv[i]*4000);}//输出数据 for(int i=1;i<=18;i++)printf("%.0f ",Lv[i]);cout<<endl;for(int i=1;i<=18;i++)printf("%.0f ",Rv[i]);cout<<endl;for(int i=1;i<=18;i++)printf("%.0f ",t[i]*1000);//毫秒
}
- 带入单片机中
部分代码(keil5)
while(tnt<=18){rv=Rv[tnt];lv=Lv[tnt];tt=t[tnt];TIM_SetCompare2(TIM8,rv);//右轮TIM_SetCompare1(TIM8,lv);//左轮delay_ms(tt);stop();tnt=tnt+1;}TIM_SetCompare2(TIM8,rv);TIM_SetCompare1(TIM8,lv);delay_ms(tt);TIM_SetCompare2(TIM8,rv);TIM_SetCompare1(TIM8,lv);delay_ms(tt);stop();
5.实验检验
完整项目代码
【stm32】单片机学习——小车的开环控制相关推荐
- 单片机入门学习五 STM32单片机学习二 跑马灯程序衍生出的stm32编程基础
上篇文章 单片机入门学习四 STM32单片机学习一 跑马灯程序和创建工程 仅介绍了入门程序及其编译运行过程,下面开始对stm32的一些基础知识做一个记录. 1.stm32f103zet6(上篇问题3 ...
- STM32单片机学习(11) DS18B20温度传感器实验
STM32单片机学习(11) DS18B20温度传感器实验 本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口, ...
- keil 4c语言读写寄存器,【STM32单片机学习】第四课:GPIO控制LED(用寄存器编程)
[朱老师课程总结] 第一部分.章节目录 第二部分.章节介绍 3.5.1.STM32的GPIO模块数据手册详解1 本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各类模式及其配置方法 ...
- 78、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序源码 七.资料包括 摘要 在当今大规模制造业中,企业为提高生产效率, ...
- 【STM32单片机学习】第一课:STM32那些你该知道的事儿
[朱老师课程总结 侵删] 第一部分.章节目录 3.1.1.STM32和STC51开发 3.1.2_3.STM32的来历背景 3.1.4.STM32简单中文手册带读 3.1.5.STM32的各种仿真器调 ...
- STM32单片机学习笔记(七)-RCC时钟控制:简单了解时钟树(一)
写在前面:本系列内容均为自学笔记,参考资料为野火指南者开发板资料及芯片参考手册等,使用野火指南者开发板进行学习,该系列内容仅用于记录笔记,不做其他用途,笔记的内容可能会存在不准确或者错误等,如有大佬看 ...
- stm32中断源有哪些_143条 超详细整理STM32单片机学习笔记(必看)
点击上方蓝色字关注我们~ 1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f10x.h相当于reg52.h(里面有基本的 ...
- 【STM32单片机学习】第三课:开发板介绍和Keil环境搭建
[朱老师课程总结 侵删] 第一部分.章节目录 3.3.1.STM32开发板详细介绍 3.3.2.STM32开发板ISP下载原理分析 3.3.3.STM32F4的浮点运算单元 3.3.4.MDK5的开发 ...
- STM32单片机学习笔记
1. AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2. Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一 ...
最新文章
- 对计算机上的浏览器的介绍,Edge浏览器的前世今生 史上最全Edge浏览器介绍
- linux 应急响应 病毒清除 系统加固
- 常用的Firefox浏览器插件、Chrome浏览器插件收藏
- “Imperceptible,Robust,and Targeted Adversaria lExamples for Automatic Speech Recognition”
- DNN结构:CNN、LSTM/RNN中的Attention结构
- javascript关键字_让我们揭开JavaScript的“ new”关键字的神秘面纱
- 神奇的不拆封读信,MIT透视技术登上nature子刊
- 看完这些美食海报,你是不是又有灵感了?
- 双层板在哪层覆铜_多层板的生产过程,与双层板有何不同?
- 笨办法学python在线阅读_『笨办法』学Python 3
- keras训练cifar10数据集源代码
- OpenCV-Python教程(6、Sobel算子)
- 蓝牙BT射频测试(转发)
- 站长必备:在线设计生成LOGO
- Android踩坑记录:This view is not constrained vertically
- 使用FileZilla下载Jason2和Jason3雷达高度计数据
- 解决:【安全警报】该站点安全证书的吊销信息不可用,是否继续?
- 《剑指Offer》之“平衡二叉树”
- jquery ui 拖拽
- 【富文本】亿图思维导图MindMaster Pro限时赠送正版