这样一个程序

#include "control.h"

#define T 0.156f

#define L 0.1445f

#define K 311.4f

u8 Flag_Target;

int Voltage_Temp,Voltage_Count,Voltage_All,sum;

/**************************************************************************

函数功能:小车运动数学模型

入口参数:速度和转角

返回  值:无

**************************************************************************/

void Kinematic_Analysis(float velocity,float angle)

{

Target_A=velocity*(1+T*tan(angle)/2/L);

Target_B=velocity*(1-T*tan(angle)/2/L);      //后轮差速

Servo=SERVO_INIT+angle*K;                    //舵机转向

}

/**************************************************************************

函数功能:所有的控制代码都在这里面

5ms定时中断由MPU6050的INT引脚触发

严格保证采样和数据处理的时间同步

**************************************************************************/

void TIM2_IRQHandler(void)

{

if(TIM2->SR&0X0001)//定时中断

{

TIM2->SR&=~(1<<0);                                                                                               //===清除定时器中断标志位

Flag_Target=!Flag_Target;

if(delay_flag==1)

{

if(++delay_50==10)         delay_50=0,delay_flag=0;                      //给主函数提供50ms的精准延时

}

if(Flag_Target==1)

{

Key();                                       //===扫描按键状态 单击双击可以改变小车运行状态

if(Flag_Way==2)

{

RD_TSL();                                            //===读取线性CCD数据

Find_CCD_Zhongzhi();                                                   //===提取中线

}

if(Flag_Way==3)

{

Sensor_Left=Get_Adc(3);                //采集左边电感的数据

Sensor_Right=Get_Adc(8);               //采集右边电感的数据

Sensor_Middle=Get_Adc(2);              //采集中间电感的数据

sum=Sensor_Left*1+Sensor_Middle*100+Sensor_Right*199;  //归一化处理

Sensor=sum/(Sensor_Left+Sensor_Middle+Sensor_Right);   //求偏差

}

}

if(Flag_Target==0)

{

Encoder_Left=-Read_Encoder(2);                                       //===读取编码器的值                                                         //为了保证M法测速的时间基准,首先读取编码器数据

Encoder_Right=-Read_Encoder(3);                                      //===读取编码器的值

Get_RC();

Kinematic_Analysis(Velocity,Angle);                                                                                                                             //小车运动学分析

if(Turn_Off(Voltage)==0)                                                                                       //===如果不存在异常

{

Motor_A=Incremental_PI_A(Encoder_Left,Target_A);                   //===速度闭环控制计算电机A最终PWM

Motor_B=Incremental_PI_B(Encoder_Right,Target_B);                  //===速度闭环控制计算电机B最终PWM

Xianfu_Pwm();                                                      //===PWM限幅

Set_Pwm(Motor_A,Motor_B,Servo);                                          //===赋值给PWM寄存器

}

else

Set_Pwm(0,0,SERVO_INIT);                                                                                  //===赋值给PWM寄存器

Voltage_Temp=Get_battery_volt();                                                 //=====读取电池电压

Voltage_Count++;                                                     //=====平均值计数器

Voltage_All+=Voltage_Temp;                                           //=====多次采样累积

if(Voltage_Count==100) Voltage=Voltage_All/100,Voltage_All=0,Voltage_Count=0;//=====求平均值

}

if(Flag_Show==0)                                Led_Flash(100);

else if(Flag_Show==1)        Led_Flash(0);

}

}

/**************************************************************************

函数功能:赋值给PWM寄存器

入口参数:左轮PWM、右轮PWM

返回  值:无

**************************************************************************/

void Set_Pwm(int motor_a,int motor_b,int servo)

{

if(Flag_Way>=2)//巡线模式下,只允许电机正转

{

if(motor_a<0)motor_a=0;

if(motor_b<0)motor_b=0;

}

if(motor_a<0)                        PWMA1=7200,PWMA2=7200+motor_a;

else                     PWMA2=7200,PWMA1=7200-motor_a;

if(motor_b<0)                        PWMB1=7200,PWMB2=7200+motor_b;

else                     PWMB2=7200,PWMB1=7200-motor_b;

SERVO=servo;

}

/**************************************************************************

函数功能:限制PWM赋值

入口参数:无

返回  值:无

**************************************************************************/

void Xianfu_Pwm(void)

{

int Amplitude=6900;    //===PWM满幅是7200 限制在6900

if(Motor_A

if(Motor_A>Amplitude)  Motor_A=Amplitude;

if(Motor_B

if(Motor_B>Amplitude)  Motor_B=Amplitude;

if(Servo

if(Servo>(SERVO_INIT+250))    Servo=SERVO_INIT+250;                  //舵机限幅

}

/**************************************************************************

函数功能:按键修改小车运行状态

入口参数:无

返回  值:无

**************************************************************************/

void Key(void)

{

u8 tmp,tmp2;

tmp=click();

if(tmp==1)Flag_Stop=!Flag_Stop;//单击控制小车的启停

//if(tmp==2)Flag_Show=!Flag_Show;//双击控制小车的显示状态

tmp2=Long_Press();

if(tmp2==1)Flag_Show=!Flag_Show;//控制小车的显示状态

}

/**************************************************************************

函数功能:异常关闭电机

入口参数:电压

返回  值:1:异常  0:正常

**************************************************************************/

u8 Turn_Off( int voltage)

{

u8 temp;

if(voltage<740||Flag_Stop==1)//电池电压低于7.4V关闭电机

{

temp=1;

}

else

temp=0;

return temp;

}

/**************************************************************************

函数功能:绝对值函数

入口参数:int

返回  值:unsigned int

**************************************************************************/

int myabs(int a)

{

int temp;

if(a<0)  temp=-a;

else temp=a;

return temp;

}

/**************************************************************************

函数功能:增量PI控制器

入口参数:编码器测量值,目标速度

返回  值:电机PWM

根据增量式离散PID公式

pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]

e(k)代表本次偏差

e(k-1)代表上一次的偏差  以此类推

pwm代表增量输出

在我们的速度控制闭环系统里面,只使用PI控制

pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)

**************************************************************************/

int Incremental_PI_A (int Encoder,int Target)

{

static int Bias,Pwm,Last_bias;

Bias=Target-Encoder;                //计算偏差

Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias;   //增量式PI控制器

Last_bias=Bias;                           //保存上一次偏差

return Pwm;                         //增量输出

}

int Incremental_PI_B (int Encoder,int Target)

{

static int Bias,Pwm,Last_bias;

Bias=Target-Encoder;                //计算偏差

Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias;   //增量式PI控制器

Last_bias=Bias;                           //保存上一次偏差

return Pwm;                         //增量输出

}

/**************************************************************************

函数功能:线性CCD取中值

入口参数:无

返回  值:无

**************************************************************************/

void  Find_CCD_Zhongzhi(void)

{

static u16 i,j,Left,Right,Last_CCD_Zhongzhi;

static u16 value1_max,value1_min;

value1_max=ADV[0];  //动态阈值算法,读取最大和最小值

for(i=5;i<123;i++)   //两边各去掉5个点

{

if(value1_max<=ADV[i])

value1_max=ADV[i];

}

value1_min=ADV[0];  //最小值

for(i=5;i<123;i++)

{

if(value1_min>=ADV[i])

value1_min=ADV[i];

}

CCD_Yuzhi=(value1_max+value1_min)/2;          //计算出本次中线提取的阈值

for(i = 5;i<118; i++)   //寻找左边跳变沿

{

if(ADV[i]>CCD_Yuzhi&&ADV[i+1]>CCD_Yuzhi&&ADV[i+2]>CCD_Yuzhi&&ADV[i+3]

{

Left=i;

break;

}

}

for(j = 118;j>5; j--)//寻找右边跳变沿

{

if(ADV[j]CCD_Yuzhi&&ADV[j+4]>CCD_Yuzhi&&ADV[j+5]>CCD_Yuzhi)

{

Right=j;

break;

}

}

CCD_Zhongzhi=(Right+Left)/2;//计算中线位置

//        if(myabs(CCD_Zhongzhi-Last_CCD_Zhongzhi)>90)   //计算中线的偏差,如果太大

//        CCD_Zhongzhi=Last_CCD_Zhongzhi;    //则取上一次的值

//        Last_CCD_Zhongzhi=CCD_Zhongzhi;  //保存上一次的偏差

}

c语言怎样将程序转化为软件,怎么才能将C程序转化为arduino程序相关推荐

  1. 完成杂志续订c语言程序,C语言程序设计报告杂志订阅管理软件.doc

    C语言程序设计报告杂志订阅管理软件 C 语 言 程 序 设 计 学院: 工程学院 班级序号: 学号: 20071003303 姓名: 华进 指导老师: 刘文中 前言 我们学习C语言课程设计的主要目的是 ...

  2. 高中数学程序图转化为c语言,程序转化成逻辑图

    已结贴√ 问题点数:20 回复次数:4 程序转化成逻辑图 有一个程序,想转成逻辑图,就是有箭头和方框的那种.请大侠们辛苦帮忙一下.先谢谢了! 程序如下: #include #include #defi ...

  3. c语言卸载了软件打不开了,控制面板卸载不了程序,手把手教你如何处理控制面板中卸载不掉的软件...

    在使用电脑系统中,当我们不喜欢某个程序要卸载时,会通过控制面板的"添加或删除程序"项目卸载程序,本来简单不能再不能简单的操作,可是有时候用户却会遇上自动弹出警告窗口"添加 ...

  4. ⭐程序员必备软件图鉴⭐(建议收藏)

    ⭐程序员必备软件图鉴⭐(建议收藏) 文章目录 ⭐程序员必备软件图鉴⭐(建议收藏) 前言: 一.系统处理类 无声的安全管家:火绒安全软件 压缩/解压神器:Band Zip 远程控制软件:向日葵 文件解锁 ...

  5. 从程序员到软件工程师

    软件产业发展到今天,分工越来越细.程序员做为一个通用的称谓已经无法确切定义各种工作的特点和分类.正因为软件开发中各种职责区分不清,无论是刚刚写代码的新手还是具有多年经验的老手,一概被扣上程序员的通用名 ...

  6. 从程序员到软件设计师的过程

    前言:软件产业发展到今天,分工越来越细.程序员做为一个通用的称谓已经无法确切定义各种工作的特点和分类.正因为软件开发中各种职责区分不清,无论是刚刚写代码的新手还是具有多年经验的老手,一概被扣上程序员的 ...

  7. 从程序员到软件设计师的过程(转)

    前言:软件产业发展到今天,分工越来越细.程序员做为一个通用的称谓已经无法确切定义各种工作的特点和分类.正因为软件开发中各种职责区分不清,无论是刚刚写代码的新手还是具有多年经验的老手,一概被扣上程序员的 ...

  8. 杂志订阅管理系统c语言实训报告,C语言程序设计报告—杂志订阅管理软件、、.doc...

    C语言程序设计报告-杂志订阅管理软件.. 中国地质大学(武汉)C语言课程设计报告 学 院: 专 业: 题 目: 杂志订阅管理系统 班 级: 姓 名: 学 号: 指导教师: 2011年1月9日 程序在最 ...

  9. 从程序员到软件设计师

    软件产业发展到今天,分工越来越细.程序员做为一个通用的称谓已经无法确切定义各种工作的特点和分类.正因为软件开发中各种职责区分不清,无论是刚刚写代码的新手还是具有多年经验的老手,一概被扣上程序员的通用名 ...

最新文章

  1. ArcEngine中的缩放地图
  2. linux网络管理证书,计算机网络管理工程师技术水平证书有什么用
  3. 多分辨率图像的快速查询
  4. oracle 裸设备 ocr,裸设备建立RAC的OCR设备不一致的问题
  5. LeetCode-链表-面试题 02.07. 链表相交
  6. java队列_RPC远程调用和消息队列MQ的区别
  7. Python3中提示:no module named 'wxpy'
  8. 31. 如何计算对象已死(引用计数器算法、可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC
  9. flag -- 诡异的memcache标记
  10. 连接数_全国建成5G基站超48万个 5G终端连接数已过亿
  11. 纪中C组模拟赛总结(2019.8.9)
  12. rbf核函数_高斯过程回归础(使用GPy和模拟函数数据集)
  13. 图片区域帧差法识别物体_matlab
  14. flutter 自定义Tabbar高度和背景色
  15. Zerodium 称 iOS exploit 过剩,将暂停收购且买价或下跌
  16. 主板定制X86嵌入式器件选型
  17. python中可变参数*args传入函数时的存储方式为,Python函数可变参数(*args,**kwargs)详解...
  18. 【Python】numpy库和scipy库的安装与使用
  19. 基于3DGIS的智慧“云”综合产业园区建设
  20. 国家电网公司电力系统设备无源无线测温需求分析

热门文章

  1. 大创学习记录(四)之yolov3代码学习
  2. 论系统的木桶理论与性能瓶颈
  3. 【文献研究】班轮联盟下合作博弈的概念
  4. 15个简易高效的代码段
  5. Java IO流 - 字节流的使用详细介绍
  6. XP系统装PhotoShop的CS3版本
  7. python指纹识别_python安全编程之指纹识别
  8. 小米MIX线刷兼救砖_解账户锁_纯净刷机包_教程
  9. 【工具】LaTeX-OCR一款免费的公式识别软件
  10. 《现代加工技术》第1章 绪论