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

📄 4012_motor.c

📁 microchip控制器的motor control 程序
💻 C
字号:
#include <p30f4012.h>
#include <stdio.h>
#include <math.h>
#include <uart.h>
#include <spi.h>
#include <adc10.h>
#include <pwm.h>
#include <qei.h>

_FOSC(CSW_FSCM_OFF & EC_PLL16);
_FWDT(WDT_ON & WDTPSA_64 & WDTPSB_4);
_FBORPOR(MCLR_EN & PWRT_64 & PBOR_ON & BORV_20 & PWMxH_ACT_HI & PWMxL_ACT_HI);   
_FGS(CODE_PROT_OFF);           

#define LED1			PORTEbits.RE1
#define LED2			PORTEbits.RE0
#define LED3			PORTEbits.RE3
#define LED4			PORTEbits.RE2

unsigned long encoder;
signed int torque=2010;
signed int dir=0;

void __attribute__((__interrupt__)) _SPI1Interrupt(void)
{

	torque=ReadSPI1();

	if(torque>1020) torque=1020;
	if(torque<-1020) torque=-1020;

	if(torque>=0) dir=0;
	else dir=1;

	if(dir==1) torque*=-1;


	torque=1024-torque;
	torque*=2;
	
	IFS0bits.SPI1IF = 0;
	SPI1STATbits.SPIROV = 0;
}

void __attribute__((__interrupt__)) _QEIInterrupt(void)
{
	IFS2bits.QEIIF = 0;
}

void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
	char ch;
	ch=ReadUART1();
	putchar(ch);
	IFS0bits.U1RXIF = 0;
}

int main(void)
{


//*************************************** A/D Conversion Initilization **********************************************

	SetChanADC10(ADC_CH0_POS_SAMPLEA_AN0 & 		// ADC_CH0_POS_SAMPLEA_AN0, ADC_CHX_POS_SAMPLEA_AN0AN1AN2
				ADC_CH0_NEG_SAMPLEA_NVREF);

	ConfigIntADC10(ADC_INT_DISABLE &			// ENABLE, DISABLE
				ADC_INT_PRI_5);				// 0~7

	OpenADC10(	ADC_MODULE_ON & 				// ON, OFF
				ADC_IDLE_CONTINUE & 			// IDLE_STOP, IDLE_CONTINUE
				ADC_FORMAT_INTG & 			// SIGN_FRACT, FRACT, SIGN_INT, INTG
				ADC_CLK_AUTO & 				// AUTO, MPWM, TMR, INT0, MANUAL
				ADC_AUTO_SAMPLING_ON & 		// ON, OFF
				ADC_SAMPLE_SIMULTANEOUS & 		// SIMULTANEOUS, INDIVIDUAL
				ADC_SAMP_ON,					// ON, OFF 

				ADC_VREF_AVDD_AVSS &			// AVDD_AVSS, EXT_AVSS, AVDD_EXT, EXT_EXT
				ADC_SCAN_ON &					// ON, OFF
				ADC_CONVERT_CH0 &				// CH0, CH_0A, CH_0ABC
				ADC_SAMPLES_PER_INT_6 &		// 1~16
				ADC_ALT_BUF_OFF &				// ON, OFF
				ADC_ALT_INPUT_OFF,			// ON, OFF

				ADC_SAMPLE_TIME_4 & 			// 0~31
				ADC_CONV_CLK_SYSTEM &			// INTERNAL_RC, SYSTEM
				ADC_CONV_CLK_16Tcy,			// Tcy2, Tcy, 3Tcy2~32Tcy

				ENABLE_AN0_ANA & 				// ALL_ANA, ALL_DIG, AN0_ANA~AN15_ANA_ANA
				ENABLE_AN1_ANA,

				SCAN_ALL);					// NONE, ALL, SKIP_SCAN_AN0~15

//**************************************** PWM Operation Initilization *********************************************

	ConfigIntMCPWM(PWM_INT_DIS &				// EN, DIS
				PWM_FLTA_DIS_INT & 			// EN_INT, DIS_INT
				PWM_INT_PR4 & 				// 0~7
				PWM_FLTA_INT_PR0);

	SetMCPWMDeadTimeGeneration(PWM_DTA4 &		// 0~63
							PWM_DTAPS4) ;		// 1, 2, 4, 8

	SetDCMCPWM(	2,							// dutycyclereg
				0,							// dutycycle
				0);							// updatedisable

	OpenMCPWM(	0x03fe, 						// period : 0x03ffe = 15.63KHz
				0x0000, 						// sptime

				PWM_EN & 					// EN, DIS
			 	PWM_IDLE_CON & 				// CON, STOP
			 	PWM_OP_SCALE1 & 				// 1~16
			 	PWM_IPCLK_SCALE1 & 			// 1, 4, 16, 64
			 	PWM_MOD_UPDN,					// FREE, SING, UPDN, DBL

				PWM_MOD1_COMP & 				// MOD1..3_COMP, MOD1..3_IND
			 	PWM_MOD2_COMP &
			 	PWM_MOD3_COMP &
			 	PWM_PEN1L & 					// PWM_PEN1L, PWM_PDIS1L
			 	PWM_PEN1H &  					// PWM_PEN1H, PWM_PDIS1H
			 	PWM_PEN2L &  					// PWM_PEN2L, PWM_PDIS2L
			 	PWM_PEN2H &  					// PWM_PEN2H, PWM_PDIS2H
			 	PWM_PEN3L &  					// PWM_PEN3L, PWM_PDIS3L
			 	PWM_PEN3H, 					// PWM_PEN3H, PWM_PDIS3H

				PWM_SEVOPS1 & 				// 1~16
			 	PWM_OSYNC_PWM & 				// PWM, TCY
			 	PWM_UEN);					// EN, DIS

//*************************************** RS232 Initilization ******************************************************

    ConfigIntUART1(UART_RX_INT_EN &				// EN, DIS
				UART_RX_INT_PR6 &				// 0 ~ 7
				UART_TX_INT_DIS &				// EN, DIS
				UART_TX_INT_PR3);				// 0 ~ 7


    OpenUART1(	UART_EN &					// EN, DIS
				UART_IDLE_CON &				// CON, STOP
				UART_ALTRX_ALTTX &			// ALTRX_ALTTX, RX_TX
				UART_EN_WAKE &				// EN_WAKE, DIS_WAKE
				UART_DIS_LOOPBACK &			// EN_LOOPBACK, DIS_LOOPBACK
				UART_EN_ABAUD &				// EN_ABAUD, DIS_ABAUD
				UART_NO_PAR_8BIT &			// NO_PAR_9BIT, NO_PAR_8BIT, ODD_PAR_8BIT, EVEN_PAR_8BIT
				UART_1STOPBIT,				// 2STOPBITS, 1STOPBIT

				UART_INT_TX_BUF_EMPTY &		// INT_BUF_EMPTY, INT_TX
				UART_TX_PIN_NORMAL &			// NORMAIL, LOW
				UART_TX_ENABLE &				// ENABLE, DISABLE
				UART_INT_RX_CHAR &			// RX_BUF_FUL, RX_3_4_FUL, RX_CHAR
				UART_ADR_DETECT_DIS &			// EN, DIS
				UART_RX_OVERRUN_CLEAR,			// CLEAR

				51);							// 16=115200BPS, 34=57600BPS, 51=38400, 103=19200, Fcy/(16(UxBRG+1))

//*************************************** SPI Initilization **********************************************

 	ConfigIntSPI1(SPI_INT_EN &					// EN, DIS
				SPI_INT_PRI_2);				// 0 ~ 7

	OpenSPI1(	FRAME_ENABLE_OFF &			// ON, OFF
				FRAME_SYNC_OUTPUT &			// INPUT, OUTPUT
				ENABLE_SDO_PIN &				// DISABLE, ENABLE
				SPI_MODE16_ON &				// ON, OFF
				SPI_SMP_OFF &					// ON, OFF
				SPI_CKE_OFF &					// ON, OFF
				SLAVE_ENABLE_ON &				// ON, OFF -> SS 巧阑 ACTIVE肺 荤侩且 巴牢瘤 搬沥
				CLK_POL_ACTIVE_HIGH &			// LOW, HIGH
				MASTER_ENABLE_OFF &			// ON, OFF -> MASTER绰 亲惑 ON栏肺 瘤沥
				SEC_PRESCAL_1_1 &				// 1_1 ~ 8_1
				PRI_PRESCAL_4_1,				// 1_1, 4_1, 16_1, 64_1 

				SPI_ENABLE &					// ENABLE, DISABLE
				SPI_IDLE_CON &				// CON, STOP
				SPI_RX_OVFLOW_CLR);			// CLR

//**************************************** QEI Initilization *********************************************

	ConfigIntQEI (QEI_INT_PRI_1 &
				QEI_INT_DISABLE);

	POSCNT = 0;

	MAXCNT = 0; //4096

	OpenQEI (	QEI_DIR_SEL_CNTRL &				// QEB, CNTRL
				QEI_INT_CLK &						// EXT_CLK, INT_CLK
				QEI_INDEX_RESET_ENABLE &			// ENABLE, DISABLE (PULSE Mode only)
				QEI_CLK_PRESCALE_8 &				// 1, 8 , 64, 256 (Timer Input Clock Prescale Select bits)
				QEI_GATED_ACC_DISABLE &			// ENABLE, DISABLE
				QEI_LOGIC_CONTROL_IO &				// LOGIC_CONTROL_IO, NORMAL_IO
				QEI_INPUTS_NOSWAP &				// SWAP, NOSWAP
				QEI_MODE_x2_PULSE &				// x4_MATCH, x4_PULSE, x2_MATCH, x2_PULSE, TIMER, OFF
				QEI_UP_COUNT &					// UP_COUNT, DOWN_COUNT
				QEI_IDLE_CON,						// IDLE_STOP, IDLE_CON

//				MATCH_INDEX_PHASEA_HIGH &			// LOW, HIGH	(x4_PULSE Mode Only)
//				MATCH_INDEX_PHASEB_LOW &			// LOW, HIGH	(x4_PULSE Mode Only)
				MATCH_INDEX_INPUT_PHASEB &			// PHASEA, PHASEB (x2_PULSE Mode only)
				MATCH_INDEX_INPUT_LOW &			// LOW, HIGH      (x2_PULSE Mode only)

				POS_CNT_ERR_INT_DISABLE &			// ENABLE, DISABLE
				QEI_QE_CLK_DIVIDE_1_16 &			// 1, 2, 4, 16, 32, 64, 128, 256
				QEI_QE_OUT_ENABLE);				// ENABLE, DISABLE (Dital Filter)
	
				QEICONbits.UPDN = 0;

//*************************************** I/O(D/A) PORT Initilization **********************************************

	TRISB = 0b0000000000111111;
	TRISD = 0b0000000000000000;
//	TRISF = 0b0000000000000100;

	signed int pos_value;
	unsigned int delay;
	

	while(1)
	{
		if(dir==0)
		{
		SetDCMCPWM(1,2030,0);
		SetDCMCPWM(2,torque,0);
		ClrWdt();
		}
		else
		{
		SetDCMCPWM(1,torque,0);
		SetDCMCPWM(2,2030,0);
		ClrWdt();
		}
	
		printf("%d \r\n",encoder);				

		encoder = ReadQEI();	
		WriteSPI1(encoder);
		PORTDbits.RD1 ^= 1;

	}	
}

⌨️ 快捷键说明

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