亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? motorctrl.c

?? 用avr實現pid算法
?? C
字號:
//*****************************************************************************
// File Name	: pid.c
// 
// Title		: test pid implementation
// Revision		: 1.1
// Notes		:
// Target MCU	: Atmel AVR series
// Editor Tabs	: 4
// 
// Revision History:
// When			Who			Description of change
// -----------	-----------	-----------------------
// 05-Feb-2003	pstang		Created the program
//*****************************************************************************

 
//----- Include Files ---------------------------------------------------------
#include <avr/io.h>		// include I/O definitions (port names, pin names, etc)
#include <avr/signal.h>	// include "signal" names (interrupt names)
#include <avr/interrupt.h>	// include interrupt support

#include "global.h"		// include our global settings
#include "uart.h"		// include uart function library
#include "rprintf.h"	// include printf function library
#include "timer.h"		// include timer function library (timing, PWM, etc)
#include "vt100.h"		// include VT100 terminal support
#include "a2d.h"		// include A2D converter support
#include "encoder.h"	// include encoder driver
#include "fixedpt.h"	// fixed-point math support
#include "cmdline.h"

// motor connection defines
#define MOTOR_BRAKE_PORT	PORTC
#define MOTOR_BRAKE_DDR		DDRC
#define MOTOR0_BRAKE		PC2
#define MOTOR1_BRAKE		PC3

#define MOTOR_PWM_PORT		PORTD
#define MOTOR_PWM_DDR		DDRD
#define MOTOR0_PWM			PD4
#define MOTOR1_PWM			PD5

#define MOTOR_DIR_PORT		PORTD
#define MOTOR_DIR_DDR		DDRD
#define MOTOR0_DIR			PD6
#define MOTOR1_DIR			PD7

// motor controller mode defines
#define CONTROLMODE_POS		0
#define CONTROLMODE_VEL		1

volatile s32 EncoderLastPos=0;
volatile u32 Counts=0;
volatile u32 Cycles=0;
volatile u08 TimerIncs=0;
volatile u08 ServiceFlag=FALSE;
volatile struct Controller_struct
{
	// controls coefficients
	s32 Kp;				// proportional gain
	s32 Ki;				// integral gain
	s32 Kd;				// derivative gain
	// state variables
	s32 error;			// error (input-feedback)
	s32 error_last;		// previous error
	s32 error_integ;	// integral of error
	s32 error_diff;		// derivative of error
	// limits
	s32 windupMax;		// integral wind-up limit
	s32 outputMax;		// motor output clamp (limit)
	// input and output
	s32 output;			// motor output
	s32 input;			// user input
	s32 feedback;		// motor feedback
	// counters
	u32 counts;
	// mode
	u08 mode;			// control mode
} Controller;

// motor command system
void motorCommand(void);
// motor command functions
void motorPosGo(void);
void motorGetCoeffs(void);
void motorSetCoeffs(void);
void motorSetMode(void);
void motorShowPID(void);
void motorHelp(void);

// motor control functions
void motorInit(void);
void motorSetPower(s32 power);

// PID controller algorithm
void pidService(void);
void timerService(void);

// testing functions
void motorTest(void);
void encoderTest(void);

//----- Begin Code ------------------------------------------------------------
int main(void)
{
	// initialize our libraries
	// initialize the UART (serial port)
	uartInit();
	// set the baud rate of the UART for our debug/reporting output
	uartSetBaudRate(115200);
	// initialize the timer system
	timerInit();
	// init A2D
	a2dInit();
	// initialize rprintf system
	rprintfInit(uartSendByte);
	// initialize vt100 library
	vt100Init();

	// clear the terminal screen
	vt100ClearScreen();
	
	// run the encoder test
	//encoderTest();

	// run the motor test
	//motorTest();

	// command system
	motorCommand();

	return 0;
}

void motorCommand(void)
{
	u08 c;

	// print welcome
	rprintf("Motor Controller V1.0\r\n");

	// initialize cmdline system
	cmdlineInit();

	// direct cmdline output to uart (serial port)
	cmdlineSetOutputFunc(uartSendByte);

	// add commands to the command database
	cmdlineAddCommand("go",			motorPosGo);
	cmdlineAddCommand("getcoeff",	motorGetCoeffs);
	cmdlineAddCommand("setcoeff",	motorSetCoeffs);
	cmdlineAddCommand("mode",		motorSetMode);
	cmdlineAddCommand("piddump",	motorShowPID);
	cmdlineAddCommand("help",		motorHelp);
	cmdlineAddCommand("enctest",	encoderTest);
	cmdlineAddCommand("motortest",	motorTest);
	// send a CR to cmdline input to stimulate a prompt
	cmdlineInputFunc('\r');


	// initialize Controller structure
	// mode
	Controller.mode			= CONTROLMODE_POS;
	// controls coefficients
	Controller.Kp			= 4000;
	Controller.Ki			= 0;
	Controller.Kd			= 4000;
	// limits
	Controller.windupMax	= 200<<8;
	Controller.outputMax	= 700;
	// state variables
	Controller.error		= 0;
	Controller.error_last	= 0;
	Controller.error_integ	= 0;
	Controller.error_diff	= 0;
	// input and output
	Controller.output		= 0;
	Controller.input		= 0;
	Controller.feedback		= 0;

	// initialize motor control lines
	motorInit();

	// set up LEDs
	outb(DDRB, 0xFF);
	// set up a2d converter
	a2dSetPrescaler(ADC_PRESCALE_DIV8);
	
	// initialize encoder
	encoderInit();

	// setup PWM on timer1
	timer1SetPrescaler(TIMER_CLK_DIV8);
	timer1PWMInit(10);
	timer1PWMAOn();
	timer1PWMBOn();
	// attach pid service
	timerAttach(TIMER1OVERFLOW_INT, pidService);

	// ***** this part currently unused *****
	// setup metering timer
	// count with 32.768KHz/8
	//timer2SetPrescaler(TIMERRTC_CLK_DIV8);
	timer2SetPrescaler(TIMERRTC_CLK_DIV1024);
	// switch to asynchronous input (32KHz crystal)
	//sbi(ASSR, AS2);
	// attach service
	//timerAttach(TIMER2OVERFLOW_INT, timerService);
	// **************************************
	
	while(1)
	{
		// pass characters received on the uart (serial port)
		// into the cmdline processor
		while(uartReceiveByte(&c)) cmdlineInputFunc(c);

		// run the cmdline execution functions
		cmdlineMainLoop();

		// print debug messages
		if(ServiceFlag)
		{
			rprintf("Cyc=");
			rprintfNum(10, 6, FALSE, ' ', Cycles);
			rprintf("  Pos=");
			rprintfNum(10, 7, TRUE, ' ', Controller.feedback);
			rprintf("  Ep=");
			rprintfNum(10, 7, TRUE, ' ', Controller.error);
			rprintf("  Ei=");
			rprintfNum(10, 7, TRUE, ' ', Controller.error_integ);
			rprintf("  Ed=");
			rprintfNum(10, 7, TRUE, ' ', Controller.error_diff);
			rprintf("  out=");
			rprintfNum(10, 7, TRUE, ' ', Controller.output);
			rprintfCRLF();
			ServiceFlag=FALSE;
		}
	}

}

void motorPosGo(void)
{
	Controller.input = cmdlineGetArgInt(1);
	rprintf("Set control input to: %d\r\n", Controller.input);
}

void motorGetCoeffs(void)
{
	rprintf("Control coeffs set to:\r\n");
	rprintfProgStrM("Kp="); rprintfNum(10, 6, TRUE, ' ', Controller.Kp); rprintfCRLF();
	rprintfProgStrM("Ki="); rprintfNum(10, 6, TRUE, ' ', Controller.Ki); rprintfCRLF();
	rprintfProgStrM("Kd="); rprintfNum(10, 6, TRUE, ' ', Controller.Kd); rprintfCRLF();
}

void motorSetCoeffs(void)
{
	Controller.Kp = cmdlineGetArgInt(1);
	Controller.Ki = cmdlineGetArgInt(2);
	Controller.Kd = cmdlineGetArgInt(3);

	motorGetCoeffs();
}

void motorSetMode(void)
{
	Controller.mode = cmdlineGetArgInt(1);
	rprintf("Control Mode set to: %d\r\n", Controller.mode);
}

void motorShowPID(void)
{
	if(cmdlineGetArgInt(1))
		timerAttach(TIMER2OVERFLOW_INT, timerService);
	else
		timerDetach(TIMER2OVERFLOW_INT);
}

void motorHelp(void)
{
	rprintfCRLF();

	rprintf("Available commands are:\r\n");
	rprintf("help                     - displays available commands\r\n");
	rprintf("go [x]                   - set controller input\r\n");
	rprintf("getcoeffs                - show controller coeffs\r\n");
	rprintf("setcoeffs [kp] [ki] [kd] - set controller coeffs\r\n");
	rprintf("mode [m]                 - set motor control mode\r\n");
	rprintf("                           m=0: position control\r\n");
	rprintf("                           m=1: velocity control\r\n");
	rprintf("enctest                  - encoder hardware test\r\n");
	rprintf("motortest                - motor hardware and driver test\r\n");

	rprintfCRLF();

}

void motorInit(void)
{
	// configure ports
	// initial state
	cbi(MOTOR_BRAKE_PORT, MOTOR0_BRAKE);
	cbi(MOTOR_BRAKE_PORT, MOTOR1_BRAKE);
	cbi(MOTOR_PWM_PORT,	MOTOR0_PWM);
	cbi(MOTOR_PWM_PORT,	MOTOR1_PWM);
	cbi(MOTOR_DIR_PORT, MOTOR0_DIR);
	cbi(MOTOR_DIR_PORT, MOTOR1_DIR);
	// I/O direction
	sbi(MOTOR_BRAKE_DDR, MOTOR0_BRAKE);
	sbi(MOTOR_BRAKE_DDR, MOTOR1_BRAKE);
	sbi(MOTOR_PWM_DDR, MOTOR0_PWM);
	sbi(MOTOR_PWM_DDR, MOTOR1_PWM);
	sbi(MOTOR_DIR_DDR, MOTOR0_DIR);
	sbi(MOTOR_DIR_DDR, MOTOR1_DIR);
}

void motorSetPower(s32 power)
{
	// set direction
	if(power > 0)
	{
		sbi(MOTOR_DIR_PORT, MOTOR0_DIR);
		sbi(MOTOR_DIR_PORT, MOTOR1_DIR);
	}
	else
	{
		cbi(MOTOR_DIR_PORT, MOTOR0_DIR);
		cbi(MOTOR_DIR_PORT, MOTOR1_DIR);
	}

	// clamp power level
	power = MIN(ABS(power),Controller.outputMax);

	// set power
	if(power < 15) power = 0;

	timer1PWMASet(power);
	timer1PWMBSet(power);

	// led debug
	outb(PORTB, (~power)>>6);
}

void pidService(void)
{
	s32 EncoderCurrentPos;
	
	// get setpoint
	// **** set by user via commands
	//Controller.input = 0;
	
	// get motor feedback
	if(Controller.mode == CONTROLMODE_POS)
	{
		// position feedback
		Controller.feedback = encoderGetPosition(0);
	}
	else
	{
		// velocity feedback
		EncoderCurrentPos = encoderGetPosition(0);
		Controller.feedback = EncoderCurrentPos-EncoderLastPos;
		EncoderLastPos = EncoderCurrentPos;
	}

	// calculate error
	Controller.error = Controller.input-Controller.feedback;
	// calculate integral error
	Controller.error_integ += Controller.error;
	// clamp integral error (anti-windup)
	//Controller.error_integ = MAX(Controller.error_integ, -Controller.windupMax);
	//Controller.error_integ = MIN(Controller.error_integ,  Controller.windupMax);
	// calculate differential error
	Controller.error_diff = Controller.error - Controller.error_last;
	Controller.error_last = Controller.error;
	// do PID
	Controller.output =	 ((Controller.Kp*Controller.error)>>8)
						+((Controller.Ki*Controller.error_integ)>>8)
						+((Controller.Kd*Controller.error_diff)>>8);
	// output value
	motorSetPower(Controller.output);
	// counters
	Controller.counts++;
}

void timerService(void)
{	
	if(!TimerIncs)
	{
		Cycles = Controller.counts;
		Controller.counts=0;
		ServiceFlag=TRUE;
		TimerIncs=3;
	}
	TimerIncs--;
}

void motorTest(void)
{
	s16 i;
	s16 dir = 1;
	u16 waitRamp = 1000;
	u16 waitConstant = 1000;

	// initialize motor control lines
	motorInit();
	
	// set maximum motor output
	Controller.outputMax = 255;
	
	// setup LEDs
	outb(DDRB, 0xFF);

	// setup PWM on timer1
	timer1SetPrescaler(TIMER_CLK_DIV64);
	// 8-bit PWM
	timer1PWMInit(8);
	// both PWM channels on
	timer1PWMAOn();
	timer1PWMBOn();

	// do speed triangle
	while(1)
	{
		// ramp speed up
		rprintfProgStrM("Ramp Up\r\n");
		for(i=0; i<256; i++)
		{
			motorSetPower(dir*i);
			timerPause(waitRamp>>8);
			outb(PORTB, ~i);
		}
		// constant speed
		rprintfProgStrM("Constant\r\n");
		timerPause(waitConstant);
		// ramp speed down
		rprintfProgStrM("Ramp Down\r\n");
		for(i=255; i>=0; i--)
		{
			motorSetPower(dir*i);
			timerPause(waitRamp>>8);
			outb(PORTB, ~i);
		}
		// stop
		rprintfProgStrM("Stop\r\n");
		timerPause(waitConstant);
		// toggle direction
		dir = -dir;
	}
}

void encoderTest(void)
{
	// initialize the encoders
	encoderInit();
	//cbi(GIMSK, INT1);

	// print a little intro message so we know things are working
	rprintf("\r\nWelcome to the encoder test!\r\n");

	// report encoder position continuously
	while(1)
	{
		rprintfProgStrM("Encoder0: ");
		// print encoder0 position
		// use base-10, 10 chars, signed, pad with spaces
		rprintfNum(10, 10, TRUE, ' ', encoderGetPosition(0));

		rprintfProgStrM("  Encoder1: ");
		// print encoder1 position
		// use base-10, 10 chars, signed, pad with spaces
		rprintfNum(10, 10, TRUE, ' ', encoderGetPosition(1));

		// print carriage return and line feed
		rprintfCRLF();

		// pause so we don't flood the host computer
		timerPause(25);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美美女bb生活片| 国产黄色91视频| 2021国产精品久久精品| 91免费观看国产| 久久精品国产亚洲aⅴ| 亚洲乱码国产乱码精品精小说| 日韩一区二区三区在线视频| 91蝌蚪porny成人天涯| 国产精品99久久久久久久女警 | 国产精品网站在线播放| 2023国产一二三区日本精品2022| 91亚洲精品久久久蜜桃网站| 韩国成人在线视频| 日本不卡中文字幕| 亚洲最新视频在线播放| 国产精品免费免费| 国产视频一区在线观看| 精品久久久久久久久久久久包黑料 | 国内成人自拍视频| 视频一区二区中文字幕| 夜夜精品视频一区二区| 一区二区中文视频| 国产精品久久久99| 欧美极品另类videosde| 久久久久99精品国产片| 欧美大白屁股肥臀xxxxxx| 欧美日韩免费观看一区三区| 日本韩国视频一区二区| 9人人澡人人爽人人精品| 国产98色在线|日韩| 国产高清不卡一区二区| 国产精品一区二区三区四区| 激情综合色综合久久| 免费观看一级特黄欧美大片| 日韩av电影免费观看高清完整版 | 精品久久久久一区| 欧美va在线播放| 欧美大片日本大片免费观看| 日韩欧美国产三级电影视频| 日韩一区二区三区在线视频| 91精品国产综合久久蜜臀| 5566中文字幕一区二区电影| 欧美日本在线看| 欧美日韩一级黄| 欧美区一区二区三区| 欧美日本在线播放| 欧美一区二区大片| 成人伦理片在线| 亚洲第一搞黄网站| 天天免费综合色| 日本午夜精品视频在线观看| 青青草原综合久久大伊人精品| 美国欧美日韩国产在线播放| 蜜桃av噜噜一区| 经典三级在线一区| 国产成人自拍网| 91亚洲国产成人精品一区二三| 91福利视频在线| 67194成人在线观看| 日韩美女在线视频| 欧美国产精品一区二区三区| 亚洲精品福利视频网站| 日韩精品免费视频人成| 国产一区二区看久久| 99精品视频在线观看免费| 在线观看日韩av先锋影音电影院| 欧美日韩一卡二卡三卡| 精品国产精品网麻豆系列| 国产精品久久久久久久裸模| 亚洲一区二区三区美女| 无码av免费一区二区三区试看 | 欧美日韩视频在线第一区| 日韩欧美一二三四区| 中文字幕一区在线观看视频| 天天综合网 天天综合色| 国产精品一区二区三区乱码| 色婷婷综合久久久中文一区二区| 欧美一区二区三区四区在线观看| 中文一区在线播放| 亚洲亚洲精品在线观看| 国产精品一区二区三区乱码| 日本精品免费观看高清观看| 精品卡一卡二卡三卡四在线| 亚洲女性喷水在线观看一区| 麻豆国产一区二区| 色天使久久综合网天天| 亚洲精品一区二区三区四区高清| 亚洲天堂a在线| 国内精品久久久久影院薰衣草| 日本韩国一区二区三区| 亚洲欧洲成人自拍| 色综合久久综合网欧美综合网 | 久草在线在线精品观看| 色综合天天性综合| 久久色视频免费观看| 亚洲最大色网站| 成人网在线播放| 日韩美女一区二区三区四区| 亚洲精品国产a久久久久久| 国产剧情av麻豆香蕉精品| 欧美亚洲综合另类| 成人免费一区二区三区视频 | 亚洲成人一区二区| av午夜一区麻豆| 久久久久久久久99精品| 蜜臀av一区二区三区| 欧美色涩在线第一页| 亚洲欧洲色图综合| 国产精品一区二区免费不卡| 日韩一区二区三免费高清| 亚洲一二三四区| 99久久99久久精品国产片果冻| 精品免费国产一区二区三区四区| 亚洲第一主播视频| 色综合久久中文字幕| 国产精品久久久久7777按摩| 国产精品一区二区黑丝| 欧美电视剧在线看免费| 美女尤物国产一区| 91精品国产综合久久小美女| 亚洲成人免费av| 精品婷婷伊人一区三区三| 成人免费在线观看入口| 99久久99精品久久久久久| 欧美激情在线一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 欧美tk—视频vk| 久久99精品久久只有精品| 欧美成人三级电影在线| 蜜乳av一区二区| 欧美成人video| 久久国产免费看| 日韩精品资源二区在线| 精品一区二区在线免费观看| 精品日韩av一区二区| 国产呦萝稀缺另类资源| 26uuu亚洲综合色| 黑人巨大精品欧美黑白配亚洲| 精品99久久久久久| 国产精品一级片| 国产日本欧美一区二区| 成人国产精品免费| 亚洲欧美日韩中文播放| 在线免费观看日韩欧美| 亚洲高清免费观看高清完整版在线观看| 91搞黄在线观看| 偷窥国产亚洲免费视频| 日韩精品影音先锋| 国产91露脸合集magnet | 国产精品久久看| 91搞黄在线观看| 日本vs亚洲vs韩国一区三区| 精品国一区二区三区| 成人中文字幕在线| 亚洲美女在线一区| 欧美丰满嫩嫩电影| 国产一区二区0| 亚洲乱码中文字幕综合| 777亚洲妇女| 国产成人精品亚洲日本在线桃色 | 久久福利视频一区二区| 国产丝袜美腿一区二区三区| 一本久久精品一区二区| 中文字幕成人av| 蜜臀久久久久久久| 欧美国产日本视频| 欧美综合久久久| 久久精品国产99| 国产精品少妇自拍| 欧美丝袜丝交足nylons图片| 久久99精品一区二区三区| 国产精品久久99| 7777精品伊人久久久大香线蕉超级流畅| 久久99精品国产.久久久久久| 中文字幕在线不卡国产视频| 欧美喷潮久久久xxxxx| 国产精品911| 午夜激情久久久| 日本一区二区成人| 91精品国产日韩91久久久久久| 国产69精品久久777的优势| 亚洲主播在线观看| 久久久99精品久久| 欧美日韩中文字幕一区二区| 国产成人啪午夜精品网站男同| 亚洲自拍偷拍欧美| 国产日韩v精品一区二区| 91国内精品野花午夜精品| 国产高清在线精品| 日韩专区一卡二卡| 综合久久久久久| 久久众筹精品私拍模特| 欧美日产在线观看| 91视频在线看| 国产一区二区在线看| 亚洲不卡一区二区三区| **性色生活片久久毛片| 欧美成人伊人久久综合网| 欧美私人免费视频| 97aⅴ精品视频一二三区|