⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 struct.c

📁 本程序用作pid控制
💻 C
字号:
#include <iom8v.h>
#include <macros.h>
#include "eeprom.h"
#include "m8pic73.h"

unsigned int out_value=0; //输出数据

unsigned char st_byte=0;                //参数指针
unsigned char st_bit=0;                 //位指针
unsigned char vbit[4]={0,0,0,0};        //参数的四位
unsigned int  hole_vbit[5]={0,0,0,0,0}; //5个参数
//hole_vbit[0] 运行目标
//hole_vbit[1] 采样时间
//hole_vbit[2] 最小变化值
//hole_vbit[3] 模式
//hole_vbit[4] 预加常数
/*********设置参数程序*********/
/*
st_byte=0;           参数指针
st_bit=0;            位指针     
vbit[4]={0,0,0,0};         参数的四位
hole_vbit[5]={0,0,0,0,0};   5个参数*/
void data_setting(void)
	 {
	 unsigned char i;
	 switch (readkey())         //根据键值跳转
	  	  	{
			case 3 :{                //OK key
				  	if (f_mode==0)  //从运行模式转到设置模式第一层
					   {
					   f_mode=1; 
					   load_vbit();        //读eeprom数据   
					   disp_ram[0]=16;     //显示格式 P
					   disp_ram[1]=18;     //显示格式 -
					   disp_ram[2]=18;     //显示格式 -
					   disp_ram[3]=st_byte;//显示被设置参数
					   disp_int_value(hole_vbit[st_byte],4);  //显示参数内容
					   }
					else
						{
						if (f_mode==2)  //从设置模式第二层转到第一层
					   	   {
						   get_hole_vbit();    //保存当前设置值
					   	   f_mode=1;    
					   	   disp_ram[0]=16;     //显示格式 P
					   	   disp_ram[1]=18;     //显示格式 -
					   	   disp_ram[2]=18;     //显示格式 -
					   	   disp_ram[3]=st_byte;//显示被设置参数
						   }
						else               //返回运行模式
							{   
							f_mode=0;
							save_vbit();        //保存数据到eeprom
							st_byte=0;          //设置要显示的参数0
							disp_int_value(hole_vbit[st_byte],4);  //显示参数内容
							disp_ram[0]=0;      //mode change need refill
							disp_ram[1]=0;
							disp_ram[2]=0;
							disp_ram[3]=0;
							}
						}   
					break;
				  	}
			case 5 :{              //add key
				    if (f_mode==0) break;
					if (f_mode==1)   //切换要设置的参数
					   {
					   st_byte++;
					   if (st_byte>4) st_byte=0;  //第5个参数后回0
					   disp_ram[3]=st_byte;
					   disp_int_value(hole_vbit[st_byte],4);  //显示参数内容
					   break;   
					   }
			         if (f_mode==2)  //加参数的值
					   {
					   vbit[st_bit]++;
					   if (vbit[st_bit]>9) vbit[st_bit]=0;
					   disp_ram[7-st_bit]=vbit[st_bit];
					   break;   
					   }
					break;
					}
			case 6 :{               //move key
				   	if (f_mode==2)  //在第二层各bit里换位置
					   {
					   disp_ram[7-st_bit]=vbit[st_bit];
					   st_bit++;
					   if (st_bit>3) st_bit=0;
					   break;
					   }
				    if (f_mode==1)  //进入设置模式第二层
					   {
					   disp_ram[3]=st_byte;
					   divide_vbit();  //分解并显示参数
					   f_mode=2; 
					   st_bit=0;
					   }
					else break;
				  	}
			default: break;
			}

	 if (hole_vbit[0]>9998) hole_vbit[0]=9999; //运行目标
	 if (hole_vbit[0]<1)    hole_vbit[0]=1;
	 
	 if (hole_vbit[1]>9998)  hole_vbit[1]=9999; //采样时间
	 if (hole_vbit[1]<1)     hole_vbit[1]=1;
	 
	 if (hole_vbit[2]>100)  hole_vbit[2]=100;  //最小变化值
	 if (hole_vbit[2]<1)    hole_vbit[2]=1;
	 
	 if (hole_vbit[3]>3)    hole_vbit[3]=3;    //模式
	 
	 if (hole_vbit[4]>511)  hole_vbit[4]=511;  //预加常数
	 if (hole_vbit[4]<1)    hole_vbit[4]=1;
	 	 
	 out_value=hole_vbit[4];  //输出等于预加常数		
	 }	 
/*****(设置参数程序**end)*******/

/*********运行输出程序*********/

void wdy_output(void)
	 {
	 switch (hole_vbit[3])         //根据模式值跳转
	 		{
			case 0 :{                //模式0 二分法逼近
				  	if (((speed_vs-hole_vbit[0])<hole_vbit[2])|((hole_vbit[0]-speed_vs)<hole_vbit[2])); //实际=目标
					else
						{
						if (speed_vs<hole_vbit[0])  //实际<目标 加大输出
					   	   {
					   	   if (out_value+((speed_vs-hole_vbit[0])/2/hole_vbit[2])>512) out_value=512;
					   	   else out_value=out_value+((speed_vs-hole_vbit[0])/2/hole_vbit[2]); 
						   }
						else                        //实际>目标 减少输出
						   {   
					   	   if (out_value<((speed_vs-hole_vbit[0])/2/hole_vbit[2])) out_value=1;
						   else out_value=out_value-((speed_vs-hole_vbit[0])/2/hole_vbit[2]);
					   	   }
						}   
					break;
				  	}
			case 1 :{              //模式1 逐个逼近
				  	if (((speed_vs-hole_vbit[0])<hole_vbit[2])|((hole_vbit[0]-speed_vs)<hole_vbit[2])); //实际=目标
					else
						{
						if (speed_vs<hole_vbit[0])  //实际<目标 加大输出
					   	   {
						   
						 // out_value=512;
						 //  if (out_value<1) out_value=1;
						 //  else out_value--;
					   	   if (out_value>511) out_value=512;
						   else out_value++; 
						   }
						else                        //实际>目标 减少输出
						   {
						//   if (out_value>511) out_value=512;
						 //  else out_value++;   
					   	   if (out_value<1) out_value=1;
						   else out_value--;
					   	   }
						}  
					break;
					}
			case 2 :{              //模式2  直接逼近
				  	if (((speed_vs-hole_vbit[0])<hole_vbit[2])|((hole_vbit[0]-speed_vs)<hole_vbit[2])); //实际=目标
					else
						{
						if (speed_vs<hole_vbit[0])  //实际<目标 加大输出
					   	   {
					   	   if (out_value+((speed_vs-hole_vbit[0])/hole_vbit[2])>512) out_value=512;
					   	   else out_value=out_value+((speed_vs-hole_vbit[0])/hole_vbit[2]); 
						   }
						else                        //实际>目标 减少输出
						   {   
					   	   if (out_value<((speed_vs-hole_vbit[0])/hole_vbit[2])) out_value=1;
						   else out_value=out_value-((speed_vs-hole_vbit[0])/hole_vbit[2]);
					   	   }
						}   
					break;
				  	}
			default: break;
			}
	 if (out_value>511) out_value=512; //
	 if (out_value<1)    out_value=1;		
     DAC_output(out_value); //输出到DAC
	 
	 }
			
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -