智能小车PID调速的MATLAB程序,STM32寻迹小车pid调速源码

智能⼩车PID调速的MATLAB程序,STM32寻迹⼩车pid调速源
#include "adc.h"
#include "common.h"
#include "usart.h"
#include "L298N.h"
#include "senser.h"
#include "NVIC.h"
#include "ir1838.h"
#include "DMA.h"
#define kP 11
#define kdI 200 //nI除数 kI=1/kdI
#define kD 120
#define kdPID 28//PID除数
#define D_INTERVAL 1200
#define I_INTERVAL 15
#define ONLINE_MINVAL 25
#define POSVAL_MAX SENSER_MAXVAL*2//位置量值域(-POSVAL_MAX,POSVAL_MAX)
俄狄浦斯情结
#define SPEED_MIN 1700
#define SPEED_NORMAL 1950
#define SPEED_MAX 2000
#define CHECK_WAIT_TIMEOUT 100000
extern u16 ADC_DataBuffer[ADC_DMA_BUFFER_LENGTH];
extern u32 senVals[3];
u16 mod=0;
int main()
{拟合优度检验
s32 PID;
s32 nP=0;
s32 nI=0;
s32 nD=0;
s32 nLastP=0;
u32 nDC=D_INTERVAL;
u32 nIC=I_INTERVAL;
s32 carSpeed=SPEED_NORMAL;
u32 checkWait=0;
u8 adjustMod=100;
common_init();
ADC_init();
#ifdef USART_ON
usart_init();
#endif
L298N_init();
#ifdef IR_CTRL_
IR1838_init();
#else
//mod=1;
#endif
DMA_init();
NVIC_init();
delayms(120);//等待DMA将 adc_buffer 填满,避免senser校准值出错(如果有0会导致minvs不正确) while (1)
{
#ifdef IR_CTRL_
Ircordpro();
#endif
switch (mod)
{
case 0:
//等待车被放上跑道
senVals[0]=ADC_DMA_getVal(0);
senVals[1]=ADC_DMA_getVal(1);
senVals[2]=ADC_DMA_getVal(2);
张量分析
#ifdef USART_ON
#define LSHIFTBIT        9
#define        SENVALGATE        9
//printDebug("senVals[0]=",senVals[0]);
/
/printDebug("senVals[1]=",senVals[1]);
//printDebug("senVals[2]=",senVals[2]);
2012北京高考理综//printDebug("-------------\n",0);
if(senVals[2]>SENVALGATE)
{
senVals[2]-=SENVALGATE;
}
else
{
senVals[2]=0;
}
senVals[2]<<=LSHIFTBIT;
L298N_setLS(senVals[2]);
乌凯L298N_setRS(senVals[2]);
//delayms(3000);
continue;
#endif
if (senVals[0]>SENSER_ORIGIN_MIN&&senVals[0]>SENSER_ORIGIN_MIN&&senVals[0]>SENSER_ORIGIN_MIN)//车被提起{
checkWait=CHECK_WAIT_TIMEOUT;
adjustMod=100;
L298N_setLS(0);
L298N_setRS(0);
}
else
{
if(adjustMod==100)
{
adjustMod=0;
Senser_reset();
}
}
switch (adjustMod)
{
case 0:
if (checkWait)
{
checkWait--;
}
else
{
adjustMod=1;
beep(900,300);
}
break;
case 1:
//将左传感器移动到线上
L298N_setLS(1400);
L298N_setRS(0);
if(senVals[0]>SENSER_ORIGIN_MIN) {
adjustMod=2;
}
break;
case 2:
//将左传感器移动到线右边
if(senVals[0]
{
L298N_setLS(0);
L298N_setRS(0);
adjustMod=3;
现代中西医结合杂志beep(900,300);
}
break;
case 3:
//左转开始扫描,直到右传感在线上
L298N_setLS(0);
L298N_setRS(1400);
if(senVals[2]>SENSER_ORIGIN_MIN) {
adjustMod=4;
}
break;
case 4:
//直到右传感器移动到线左边
if(senVals[2]
{
adjustMod=5;
beep(900,300);
}
break;
case 5:
//右转直到中间传感器在线上
L298N_setLS(1400);
L298N_setLS(0);
if(senVals[1]>SENSER_ORIGIN_MIN) {
beep(800,300);
delayms(10);
beep(600,300);
delayms(10);
beep(600,300);
delayms(10);
beep(600,300);
mod=1;
}
}
if(adjustMod==3||adjustMod==4)
{
//校正
Senser_getsv(0);
Senser_getsv(1);

本文发布于:2024-09-21 17:54:16,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/217748.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:直到   调速   传感器   避免   校准   检验   跑道
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议