在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → PID控制(倒立摆程序)

PID控制(倒立摆程序)

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:6.28M
  • 下载次数:24
  • 浏览次数:205
  • 发布时间:2021-03-21
  • 实例类别:嵌入式开发
  • 发 布 人:18146707650
  • 文件格式:.rar
  • 所需积分:2
 相关标签: PID控制 pid id 控制

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

倒立摆程序


/*倒立摆的调节上摆函数未成功:main函数的124行*/


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "wdg.h"
#include "timer.h"
#include "pwm.h"
#include "lcd.h"
#include "adc.h"
//#include "moto.h"
//#include "pid. h"


// #include "spi.h"
// #include "flash.h"
// #include "text.h"
// #include "fontupd.h"

extern volatile int AD[3];    //AD采集到的值
u8 start=1;
//u8 PID_flag;
u8 flag=0;
//u16 tmp;

struct PID { 
int SetPoint;  //设定目标 Desired Value 
int Proportion;//比例常数 Proportional Const 
int Integral;  //积分常数 Integral Const 
int Derivative;//微分常数 Derivative Const 
int LastError; //上次误差Error[-1] 
int PrevError; //当前误差Error[-2] 
int SumError;  //历史误差累计值Sums of Errors 
}; struct PID spid; //PID Control Structure 
 int rout;  //输出PID Response (Output) 
 int rin;   //反馈PID Feedback (Input) 

//PID核心算法(位置式)
int PIDCalc( struct PID *pp, unsigned int NextPoint ) 
{ 
	int dError,Error;//定义微分偏差和偏差
	Error = pp->SetPoint - NextPoint;//偏差=设定值-当前采样值
	pp->PrevError = pp->LastError;//保存,将最终误差赋值给前一个误差 
	pp->LastError = Error;//将当前偏差赋值给上次误差 
	pp->SumError  = Error; //积分,历史偏差累加 
	dError = pp->LastError - pp->PrevError;//当前微分,历史偏差相减
	
	//返回PID参数,输出控制参数
	return (pp->Proportion * Error//比例项
	  pp->Integral * pp->SumError//积分项
	  pp->Derivative * dError);// 微分项 
} 

//初始化PID各参数 
void PIDInit (struct PID *pp) 
{ 
	//(24,21)(24,20)(16,20动态模型)(12,24,380动态)(24,20,276)
	pp->SetPoint=2022;  //设定中心角度(±180°)为512(ADC)
	pp->Proportion=14;  //设定PID比例常数	  23
	pp->Integral=3;     //设定PID积分常数
	pp->Derivative=46; //设定PID微分常数
	pp->LastError=0;   //设定PID最终误差Error[-1]
	pp->PrevError=0;   //设定PID前一个误差Error[-2] 
	pp->SumError=0;    //设定历史误差累计值Sums of Errors 
}

void Speed_Adjust(uint16_t v,uint16_t t,uint8_t Direction)//调速(最大速度,时间,方向)
{
	uint16_t i=0;

	switch(Direction)
	{
	case 0:
											
						TIM_SetCompare2(TIM3,0);//启动加速
						TIM_SetCompare1(TIM3,8000);				 		
					break;
	case 1:
					
						TIM_SetCompare1(TIM3,0);
					  TIM_SetCompare2(TIM3,8000);								
					break;

	default: break;
	}
}

void Rock()
{
	if((AD[0]>=1822)&&(AD[0]<=2222))  //PID调节范围
	{
		rin=AD[0];//PID输入参数,ADC 的值
		rout=PIDCalc(&spid,rin);
	
		if(rout>0)
		{	
		 	TIM_SetCompare1(TIM3,0);
			TIM_SetCompare2(TIM3,rout 900);
		
		}
	   else if(rout<0) 
		{	 

			rout=-rout;
			TIM_SetCompare2(TIM3,0);
			TIM_SetCompare1(TIM3,rout 900);
				
		}

	}
	else
	{
	 TIM_SetCompare2(TIM3,0); TIM_SetCompare1(TIM3,0);  // start=1;delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);			  
	}
////////////////////////////////////////////////////////////////////////
	while((AD[0]>1728)&&(AD[0]<=1828))//上半圆不控制
	{
			TIM_SetCompare1(TIM3,0);
			TIM_SetCompare2(TIM3,900);	
	}
	while((AD[0]<2338)&&(AD[0]>2238))
	{
			TIM_SetCompare2(TIM3,0);
			TIM_SetCompare1(TIM3,900);
	}


////////////////////////////////////////////////////////////////////////
if(start==1)  //调节上摆程序
 {
	//	 Speed_Adjust(5000,50,0);//调速(速度,时间,方向)		   
	 // delay_ms(1000);delay_ms(1000);delay_ms(1000);
	   start=0;	
 }
	
} 
 int main(void)
 {
	SystemInit();
	delay_init(72);	     //延时初始化
	NVIC_Configuration();
    uart_init(9600);	 
 	LED_Init();
 	KEY_Init();
	LCD_Init();
	Adc_Init();
	POINT_COLOR=RED;
  PWM_Init(10000,0);	 //不分频。PWM频率20KHz
	PIDInit (&spid);//初始化PID算法
	Timerx_Init(100,7199);//10Khz的计数频率,计数到100 10ms	
	POINT_COLOR=RED;      					    	    
	LCD_ShowStr(120-7*8,50,0,7);//显示古诗《赋得古原草送别》
	POINT_COLOR=BLUE;
	LCD_ShowStr(120-3*8,50 16,55,58);//显示诗人:白居易
	POINT_COLOR=BLACK;
	LCD_ShowStr(32,50 32,8,55);//显示内容
	POINT_COLOR =RED;	
	LCD_ShowString(0,0,"ADC:");		 //显示一个字符串,16字体
	 while(1)
	{     
		 LCD_ShowNum(32,0,AD[0],4,16);//显示ADC的值
	   Rock();  
  // LCD_LED=0;//lcd背光关闭
    }
}


标签: PID控制 pid id 控制

实例下载地址

PID控制(倒立摆程序)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警