基于MSP430单片机的四旋翼 PID Control种群遗传算法

发布者:sjjawx831最新更新时间:2020-07-21 来源: 51hei关键字:MSP430  单片机  四旋翼  PID  Control  种群遗传算法 手机看文章 扫描二维码
随时随地手机看文章

PID Control种群遗传算法:

#include "io430x14x.h"

#include "stdlib.h"

#include "sys.h"

#include "Control.h"



#define col_MAX 50                //群体空间大小

#define var_p 65                //变异概率:65 对应的变异概率约等于0.001,655 为0.01   rand():0-65535

#define epoch_MAX 200        //进化代数

void inherit(void)                //遗传进化PID

{

        unsigned int colony[col_MAX]={

        62267,15148,39769,31849,58411,49944,29915,58375 ,53831

        ,29144,40332,51900,60411,48378,11552,26588,61306,60089

        ,26887,58565, 3794,23125,53291,  646, 9102,13288,13023

        ,39570,17838,13029, 1001,48941,29169,61066,30539,27436

        ,55457,34416,13280,44049,54926, 1287,44647,24869,54512

        ,32952,46495,28107,19963,12429

        };

        unsigned int health[col_MAX];        //对应colony[] ,每个个体的适应值,

        unsigned int dad,mum,baby1,baby2;

        unsigned int mini_health,mini_id;

        unsigned int temp_health;

        unsigned char i,epoch;        //epoch 遗传代数

        mini_health = found(&colony[0],&health[0]);        //评估初始个体,并作适应值缩放,找出最小适应值

        for(epoch=0; epoch < epoch_MAX; epoch++) //开始进化

        {

                i = roulette(&health[0]);//轮盘赌转,返回数组下标

                dad = colony[i];

                i = roulette(&health[0]);//轮盘赌转,返回数组下标

                mum = colony[i];

                baby1 = dad&0xff;baby1 |= mum&0xff00;

                baby2 = mum&0xff;baby2 |= dad&0xff00;

                baby1 = variation(baby1);        //变异?

                baby2 = variation(baby2);

                temp_health = evaluating_unit(baby1);        //评估个体适应值

                if(temp_health > mini_health)

                {

                        mini_id = evaluating(&health[0]);        //取得最差适应值的个体id(数组下标)

                        colony[mini_id] = baby1;

                        health[mini_id] = temp_health - mini_health;

                }

                temp_health = evaluating_unit(baby2);        //评估个体适应值

                if(temp_health > mini_health)

                {

                        mini_id = evaluating(&health[0]);        //取得最差个体的适应值,及其id

                        colony[mini_id] = baby2;

                        health[mini_id] = temp_health - mini_health;

                }

        }

        while(1); //结束进化

}


#define ev_N 25

#define aim_value 300

uint evaluating_unit(uint unit)//评估个体适应值  顺便PWM输出

{

        uint ret=0,temp=0,max=0;

        uchar i=0;

        int uk=0;                                //PID增量

        redressal(pid, unit);        //根据个体,对基因进行解码  修改PID三个参数

        while(i        {

                        if(measured > desired)

                        {

                                temp = measured - desired;

                                if(temp > max)

                                        max=temp;        //最大超调量

                        }

                        else

                                temp = desired - measured;

                       

                        ret+=temp;

                        uk = (int)(PID_Posi(pid, measured, desired));        //PWM输出

                        M1 = speed[0] - uk;        //y轴

                        M3 = speed[0] + uk;        //y轴


                        i++;

                }

        }

        ret=65535/(ret/ev_N+max);

        return ret;        //返回适应值

}


void redressal(float* pid,uint colon)

{

        pid[0]=(float)((colon&0xFC00)>>10)*5.0/63;        //[0:0.079:5]

        pid[1]=(float)((colon&0x3E0)>>5)*0.1/31.0;        //[0:0.0032:0.1]

        pid[2]=(float)(colon&0x1F)/31.0;                        //[0:0.032:1]

}


uint found(uint colony,uint health)        //计算初始群体适应值,并找出最小值

{

        uchar i;

        uint mini=0xff;

        for(i=0;i        {

                *(health+i) = evaluating_unit(*(colony+i));        //评估个体适应值

                if(*(health+i)                        mini=*(health+i);

        }

        for(i=0;i                *(health+i)-=mini;

        return mini;

}


uchar roulette(uint health)

{

        uchar i;

        uint temp=0;

        i=(uchar)(rand()%col_MAX); //0~(col_MAX-1) 随机选择起点

        while(1)

        {

                if((col_MAX-1)==i) //实现首尾相接

                        i=0;

               

                temp+=*(health+i); //累加适应值

                if (temp>1200)

                        return i;

                i++;

        }

}


uchar evaluating(uint health)        //取得最小适应值的个体id(数组下标)

{

        uchar i,id;

        uint mini=0xffff;

        for(i=0;i        {

                if(*(health+i)                {

                        mini=*(health+i);

                        id=i;

                }

        }

        return id;

}


uint variation(uint baby)        //对基因进行变异

{

        uchar i;

        for(i=0;i<16;i++)

        {

                if(rand()                {

                        if(0==(baby&(1<                                baby|=(1<                        else

                                baby &= ~(1<                }

[1] [2]
关键字:MSP430  单片机  四旋翼  PID  Control  种群遗传算法 引用地址:基于MSP430单片机的四旋翼 PID Control种群遗传算法

上一篇:MSP430单片机的软件IIC通信控制OLED
下一篇:恒流充电与放电电池测试仪(msp430单片机主控)

推荐阅读最新更新时间:2024-11-10 15:01

基于PIC18F系列单片机的嵌入式系统设计
前 言 嵌入式系统是指以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统对功能、体积、成本、可靠性、功耗严格要求的专用计算机系统。嵌入式系统是面向应用的,系统的硬件选型和软件开发模式都必须根据具体的应用确定。 永磁无刷直流电动机是电机控制研究领域的热点之一,这与其自身固有的技术优势密切相关:以电子换相取代了有刷直流电动机的机械换相。从根本上革除了普通有刷直流电动机由于电刷换相带来的火花、噪音、高故障率等一系列问题,同时又使系统的性能能够与普通有刷直流电动机相媲美,因此得到了广泛的应用。永磁无刷直流电动机的电子换相离不开电机的转子位置信号,传统的方法是采用 霍尔器件 或其他位置 传感器 检测位置信号,这使得系统的
[单片机]
基于PIC18F系列<font color='red'>单片机</font>的嵌入式系统设计
单片机中断应用程序
/*单片机中断反应 */ //==声明区===================================================================================================== #include reg52.h #define uint unsigned int #define uchar unsigned char void delay(uint a); bit c,b; //==主程序区=========================================================================================
[单片机]
基于P89C668单片机设计的自动测试诊断系统
随着IT产业和通信技术、电子技术、计算机技术的高速发展,大量的生产装备和产品的电子化、数字化、自动化、智能化的程度越来越高,与之配套的电子测量设备必须适应这种形势。因此,综合测量技术、电子技术、自动化技术和计算机技术于一体的自动测试系统发展日益完善,在一些高度电子化产品、航空航天和军用武器装备中以及工业自动化、通信、光学、能源等诸多领域中得到了广泛应用。 一般意义的自动测试系统是指采用计算机控制,能实现自动化测试的系统。这类系统通常是在标准的测控总线或仪器总线(CAMAC、GPIB、VXI、 PXI、CAN等)的基础上组建而成的。目前,通用串行总线(Universal SerialBus,即USB)以其方便的即插即用和热插拔特性及
[单片机]
基于P89C668<font color='red'>单片机</font>设计的自动测试诊断系统
基于PIC18单片机的Bootloader设计
Bootloader是操作系统在内核运行之前运行的一段小程序,其功能主要是完成软硬件设备初始化,建立内存空间映射,从而将系统的软硬件环境带到一个合适的状态,或者加载操作系统映像文件实现系统软件升级,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。   针对PIC18系列单片机,目前市面上仅存在HI-TECH公司提供的Bootloader程序,并且需要借助串口调试助手。本文基于Microchip公司的MPLAB软件开发环境设计了一种新颖的Bootloader,并配套编写了PC机端上位机界
[单片机]
基于PIC18<font color='red'>单片机</font>的Bootloader设计
MSP430G2553与MSP430F5336系列单片机总结[0]——概述
最近用了MSP430系列的两款单片机,一块是MSP430G2553,市面上有卖,管脚和功能比较少,但是网上的例程和资料很多,比较适合MSP430系列的单片机上手;另一块F5336系列有引脚和功能都较多,是我们自己买芯片做的,外部时钟XT1接了32768HZ的晶振,XT2接了20Mhz的晶振,因为项目需要先后接触了这两块板子,对于MSP430系列的编程也有了一定的了解,所以简单总结一下。 先简单说一下我对MSP430系列单片机的理解,不同的单片机各有其特色,51适用范围比较广泛,Arduino容易上手编程简单,而MSP430最大的特点就是低功耗,适用于一些有特定要求的工业领域,它的内部有不同的时钟源选择,与其对应也有不同的低功耗
[单片机]
51单片机(汇编语言)实现十进制转十六进制
任务描述 DEC0 DEC1 DEC2 存放 十进制 数 eg:03 35 96 HEX0 HEX1存放十六进制数 eg:83 3C 任务原理 本质是BCD码转二进制 所谓的十进制 如“15”,对应的是 0x15H 这一个十六进制数,而0x15的十进制数为21,二进制为0001 0101(就是1 “和” 5) 所以,我们要做的是 把每一位十进制的BCD码提出来,附上相应的权重,结果本质为普通的二进制,表现为十六进制(这听起来很绕口)但是在keil里跑一下会更好理解(后面会结合代码分析) 方案Ⅰ 思路 循环— (HEX*10)+TMP 1.从高位开始 提取“十进制”的每一位数(半个byte存一位) 2.带进位的循环
[单片机]
51<font color='red'>单片机</font>(汇编语言)实现十进制转十六进制
STC89C52单片机按键实验
////////////////////////////////////////////////////////////////////////// 实现功能: 完成独立按键的测试,当key1-key4这四个按键中,有一个按下时,在 开发板的第一个数码管上会显示具体的数值,比如说按下key1键,在 数码管上会显示1,其他的类似 实验板型号:BS-XYD-C52 实验名称: 静态数码管 编写人: 谢应东 编写日期: 2012-4-26 ///////////////////////////////////////////////////////////////////
[单片机]
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(12)FMC 模块介绍
12.1.FMC 基础知识 闪存控制器(FMC),提供了片上闪存需要的所有功能。FMC 也提供了页擦除,整片擦除,以及32 位整字或 16 位半字编程闪存等操作。 GD32 MCU 支持不同类型编程的具体说明如下表 GD32 MCU 不同系列编程区别所示。 12.2.FMC 功能 支持 32 位整字或 16 位半字编程,页擦除和整片擦除操作; 支持 CPU 执行指令零等待区域(code area)和非零等待区域(data area); 大小为 16 字节的可选字节块可根据用户需求配置; 具有安全保护状态,可阻止对代码或数据的非法读访问; 相关术语说明 GD32F10x 和 F30x 分别有 MD(中容量) 、HD(大容量)、X
[单片机]
【GD32 <font color='red'>MCU</font> 入门教程】GD32 <font color='red'>MCU</font> 常见外设介绍(12)FMC 模块介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved