📄 4012_motor.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 + -