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

📄 commands.c

📁 dc servo using dspic30f
💻 C
字号:
//---------------------------------------------------------------------
//	File:		commands.c
//
//	Written By:	Lawrence Glaister VE7IT
//
// Purpose: This set of routines deals used to implement
//          the serial command struct for configuring
//          the internal servo parameters.
//---------------------------------------------------------------------
//
// Revision History
//
// Aug 11 2006 --    first version Lawrence Glaister
// Sept 22 2006      added deadband programming
// Sept 25 2006      added programmable servo loop interval// 
//---------------------------------------------------------------------- #include "dspicservo.h"#include <stdio.h>
#include <stdlib.h>
#include <math.h>

extern volatile unsigned short int timer_test;
extern volatile unsigned short int do_servo;
extern unsigned short int cmd_posn;			// current posn cmd from PC
extern unsigned short int cmd_err;			// number of bogus encoder positions detected
extern unsigned short int cmd_bits;			// a 4 bit number with old and new port values
extern volatile unsigned short int do_servo;
extern struct PID pid;

extern char rxbuff[];		// global rx buffer for serial data
extern char *rxbuffptr;		// local input ptr for storing data
extern short int rxrdy;		// flag to indicate a line of data is available in buffer

extern int save_setup( void );

void print_tuning(void)
{
	printf("\rCurrent Settings:\r\n");
	printf("servo enabled = %d\r\n",	pid.enable);
	printf("(p) = %f\r\n",		(double)pid.pgain);
	printf("(i) = %f\r\n",		(double)pid.igain);
	printf("(d) = %f\r\n",		(double)pid.dgain);
	printf("FF(0) = %f\r\n",	(double)pid.ff0gain);
	printf("FF(1) = %f\r\n",	(double)pid.ff1gain);
    printf("dead(b)and = %f\r\n",(double)pid.deadband);
	printf("(m)ax Output = %f\r\n",(double)pid.maxoutput);
	printf("(f)ault error = %f\r\n", (double)pid.maxerror);
	printf("(x)pc cmd multiplier = %hu\r\n", pid.multiplier);
    printf("(t)icks per servo cycle= %hu\r\n",pid.ticksperservo);
}

void process_serial_buffer()
{
//	int i;

//	printf("processing serial buffer\r\n");
//	for ( i=0; i < 15; i++ )
//	{
//		if ( rxbuff[i] )
//			printf("%02X ",rxbuff[i] & 0xff);
//		else
//		{
//			printf("\r\n");
//			break;
//		}
//	}

	switch( rxbuff[0] )
	{
	case 'b':
		if (rxbuff[1])
		{
			pid.deadband = atof(&rxbuff[1]);
			save_setup();
		}
		print_tuning();
		break;		

	case 'p':
		if (rxbuff[1])
		{
			pid.pgain = atof(&rxbuff[1]);
			save_setup();
		}
		print_tuning();
		break;		
	case 'i':
		if (rxbuff[1])
		{
			pid.igain = atof(&rxbuff[1]);
			pid.error_i = 0.0;	//reset integrator
			save_setup();
		}
		print_tuning();
		break;		
	case 'd':
		if (rxbuff[1])
		{
			pid.dgain = atof(&rxbuff[1]);
			save_setup();
		}
		print_tuning();
		break;		
	case '0':
		if (rxbuff[1])
		{
			pid.ff0gain = atof(&rxbuff[1]);
			save_setup();
		}
		print_tuning();
		break;		
	case '1':
		if (rxbuff[1])
		{
			pid.ff1gain = atof(&rxbuff[1]);
			save_setup();
		}
		print_tuning();
		break;		
	case 'm':
		if (rxbuff[1])
		{
			pid.maxoutput = atof(&rxbuff[1]);
			save_setup();
		}
		print_tuning();
		break;		

	case 'f':
		if (rxbuff[1])
		{
			pid.maxerror = atof(&rxbuff[1]);
			save_setup();
		}
		print_tuning();
		break;		

	case 'x':
		if (rxbuff[1])
		{
			pid.multiplier = (short)atof(&rxbuff[1]);
			if ( pid.multiplier < 1 ) pid.multiplier = 1;
			if ( pid.multiplier > 16 ) pid.multiplier = 16;
			save_setup();
		}
		print_tuning();
		break;		

    case 't':
		if (rxbuff[1])
		{
			pid.ticksperservo = (short)atof(&rxbuff[1]);
			if ( pid.ticksperservo < 2 ) pid.ticksperservo = 2;		// 200us/servo calc
			if ( pid.ticksperservo > 100 ) pid.ticksperservo = 100; // .1 sec/servo calc
			save_setup();
		}
		print_tuning();
		break;		


	case 'e':
		printf("\rencoder = 0x%04X = %d\r\n",POSCNT, POSCNT & 0xffff);
		break;	

	case 'l':
		print_tuning();
		break;

	case 's':
		printf("\rServo Loop Internal Calcs:\r\n");
		printf("command: %ld\r\n",pid.command);
		printf("feedback: %ld\r\n",pid.feedback);
		printf("error: %f\r\n",(double)pid.error);
		printf("error_i: %f\r\n",(double)pid.error_i);
		printf("error_d: %f\r\n",(double)pid.error_d);
		printf("output: %f\r\n",(double)pid.output);
		printf("limit_state: %d\r\n",(int)pid.limit_state);
		break;

	default:
		printf("\r\nUSAGE:\r\n");
		printf("p x.x set proportional gain\r\n");
        printf("i x.x set integral gain\r\n"); 
		printf("d x.x set differential gain\r\n"); 
        printf("0 x.x set FF0 gain\r\n"); 
		printf("1 x.x set FF1 gain\r\n"); 
		printf("b x.x set deadband\r\n");
		printf("m x.x set max output current(amps)\r\n"); 
		printf("f x.x set max error before drive faults(counts)\r\n");
		printf("x n   set pc command multiplier (1-16)\r\n");
        printf("t n   set # of 100us ticks/per servo calc(2-100)\r\n");
		printf("e print current encoder count\r\n"); 
		printf("l print current loop tuning values\r\n"); 
        printf("s print internal loop components\r\n");
		printf("? print this help\r\n");
	}


	// reset input buffer state
	rxrdy = 0;
	rxbuff[0] = 0;
	rxbuffptr = &rxbuff[0];
	putchar('>');
}

⌨️ 快捷键说明

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