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

📄 feedback.c

📁 电机PID调速程序
💻 C
字号:
#include <ADUC842.H>
#include <math.h>
#include "feedback.h"
#include "lcd.h"

sbit  FB_DIR_L = P1^6;				//用于反馈电机转向,根据需要调整 MOTOR_FEEDBACK()鉴向函数
sbit  FB_DIR_R = P1^7;				//顺时针时 FB_DIR_L = 1


//反馈参数定义
int fb_V_L;					 	   	//反馈当前速度
int fb_V_R;

long xdata rea_all_num_l;
long xdata rea_all_num_r;

/*****************************************延时函数************************************************/
//输入值为延时模式mode和延时长度time,无返回值
//调用函数:无

void DELAY(unsigned char mode,unsigned char time)
{
	unsigned int m,n;
	unsigned char k;
	switch(mode)								//mode为延时模式,time为延时长度	
	{
		case 0:	        						//2.68毫秒,此时对应电机速度100--1.2m/s
		{
				for(k=0;k<time;k++)
				for(m=0;m<2;m++)
				for(n=0;n<2450;n++);
		}break;

		case 1:		   							//一秒
		{	
				for(k=0;k<time;k++)
				for(m=0;m<400;m++)
				for(n=0;n<4000;n++);

		}break;

		case 2:		  							//一分钟
		{
				for(k=0;k<time;k++)
				for(m=0;m<24000;m++)
				for(n=0;n<4000;n++);
		}break;

		default:								 //其他
		break;
	} 
}


/*******************************速度反馈*********************************/
//反馈捕获函数
//获得反馈速度和反馈电流

void GET_FEEDBACK()
{
    int speed_num_l=0;						//用于获得当前速度
	int speed_num_r=0;

	TL0 = 0;
	TH0 = 0;
	TL1 = 0;
	TH1 = 0;
	TR0 = 1;							    //计数器接通工作
	TR1 = 1;
    
	DELAY(0,1);							   //the sampling cycle根据所选电机实际测得,
	
	speed_num_l    = ((int)TH0<<8)+TL0;	   //可以加上个防止溢出的中断程序				   
	speed_num_r    = ((int)TH1<<8)+TL1;

	
    TR0 = 0;							    //关闭计数器
	TR1 = 0;

/***********************位置控制**************************/
 	 	TR0 = 1;
  
       if(FB_DIR_L)			//鉴向
	      {
	  	    rea_all_num_l -= (((int)TH0<<8)+TL0);
          }																	 
	   else
	      {
		    rea_all_num_l += (((int)TH0<<8)+TL0);			//可以加上个防止溢出的中断程序 	
          }
 
	   TR1 = 1;
       	           
       if(FB_DIR_R)
	     {
           rea_all_num_r += (((int)TH1<<8)+TL1); 				
	     }
	   else
	     {
		   rea_all_num_r -= (((int)TH1<<8)+TL1); 		
	     }       

    TL0 = 0;
	TH0 = 0;
	TL1 = 0;
	TH1 = 0;
	//---------------check the direction-------------------------------------------------
    if(FB_DIR_L)			//鉴向
	{
	  	speed_num_l = 0 - speed_num_l;
	}																	 
	else
	{
		speed_num_l = speed_num_l; 	
	}
	
	if(FB_DIR_R)
	{
        speed_num_r = speed_num_r; 				
	}
	else
	{
		speed_num_r = 0 - speed_num_r; 		
	}

	fb_V_L   =	speed_num_l;
	fb_V_R	 =  speed_num_r;
}

⌨️ 快捷键说明

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