/* * Copyright (c) 2021, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "delay.h" #include "dfoc.h" #include "mt6701.h" #include "soft_i2c.h" #include "ti_msp_dl_config.h" #include #include #include #include #include extern float angle_f; extern bool gIsI2cError; const float num_f = 0.123456f; volatile uint16_t count = 0; volatile float Target = 0; // 串口目标值 const int pp = 7; // 电机极对数 const int Dir = -1; // 电机编码器方向 #define UART_PACKET_SIZE (6) /* Data received from UART */ volatile uint8_t gUartRxPacket[UART_PACKET_SIZE] = {'a', 'b', 'c', 'd', 'e', 'f'}; volatile bool gCheckUART; void parse_uart_cmd(void) { char num[10] = {0}; int i = 1; int j = 0; if (gUartRxPacket[0] == 'T' && gUartRxPacket[UART_PACKET_SIZE - 1] == '\n') // 数据第一位与数据的最后一位 { if (gUartRxPacket[1] != '-') // 接受到的数据为正数 { while (gUartRxPacket[i] != '\n' && (isdigit(gUartRxPacket[i]) || gUartRxPacket[i] == '.')) { num[j++] = gUartRxPacket[i++]; } Target = atof(num); // Serial_SendFloatNumber(Target,3,2); } else // 接收到的数据为负数 { i = 2; while (gUartRxPacket[i] != '\n' && (isdigit(gUartRxPacket[i]) || gUartRxPacket[i] == '.')) { num[j++] = gUartRxPacket[i++]; } Target = -(atof(num)); // Serial_SendFloatNumber(Target,3,2); } printf("%s", gUartRxPacket); } else { printf((char *)"Input format error\n"); } } int main(void) { SYSCFG_DL_init(); /* Configure DMA source, destination and size */ // DL_DMA_setSrcAddr(DMA, DMA_CH1_CHAN_ID, (uint32_t)(&UART_0_INST->RXDATA)); // DL_DMA_setDestAddr(DMA, DMA_CH1_CHAN_ID, (uint32_t)&gUartRxPacket[0]); // DL_DMA_setTransferSize(DMA, DMA_CH1_CHAN_ID, UART_PACKET_SIZE); // DL_DMA_enableChannel(DMA, DMA_CH1_CHAN_ID); NVIC_EnableIRQ(UART_0_INST_INT_IRQN); // DL_TimerA_startCounter(PWM_0_INST); // NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN); // DL_TimerG_startCounter(TIMER_0_INST); // FOC_Init(12); // DL_SYSTICK_resetValue(); uint32_t readback = 0xffff; while (1) { I2C_Start(); I2C_SendByte(0x06 << 1); I2C_RecviveAck(); I2C_SendByte(0x03); I2C_RecviveAck(); I2C_Stop(); // DL_GPIO_writePinsVal(LED_PORT, LED_PA0_PIN, 1); // readback = DL_GPIO_readPins(LED_PORT, LED_PA0_PIN); // printf("pa 0readback is %d \n", readback); // delay_ms(100); // DL_GPIO_writePinsVal(LED_PORT, LED_PA0_PIN, 0); // readback = DL_GPIO_readPins(LED_PORT, LED_PA0_PIN); // printf("pa0 readback is %d \n", readback); // delay_ms(100); // DL_GPIO_disableOutput(SOFT_I2C_PORT, SOFT_I2C_CLK_PIN); // DL_GPIO_initDigitalInputFeatures( // SOFT_I2C_CLK_IOMUX, DL_GPIO_INVERSION_DISABLE, // DL_GPIO_RESISTOR_PULL_UP, DL_GPIO_HYSTERESIS_DISABLE, // DL_GPIO_WAKEUP_DISABLE); // DL_GPIO_disableOutput(SOFT_I2C_PORT, SOFT_I2C_SDA_PIN); // DL_GPIO_initDigitalInputFeatures( // SOFT_I2C_SDA_IOMUX, DL_GPIO_INVERSION_DISABLE, // DL_GPIO_RESISTOR_PULL_UP, DL_GPIO_HYSTERESIS_DISABLE, // DL_GPIO_WAKEUP_DISABLE); // readback = // DL_GPIO_readPins(SOFT_I2C_PORT, SOFT_I2C_CLK_PIN | SOFT_I2C_SDA_PIN); // printf("soft_i2c_clk readback is %x \n", readback); // delay_ms(100); // // DL_GPIO_togglePins(LED_PORT, LED_PA0_PIN); // // delay_ms(10); // // 开环 // // velocityopenloop(Target); // // 闭环 // Set_Angle(Target); // if (gCheckUART) { // gCheckUART = false; // parse_uart_cmd(); // // Set_Angle(Target); // } // // delay_ms(10); } } void TIMER_0_INST_IRQHandler(void) { switch (DL_TimerA_getPendingInterrupt(TIMER_0_INST)) { case DL_TIMERG_INTERRUPT_ZERO_EVENT: printf("Target is %f \n", Target); // printf("%s",gUartRxPacket); DL_GPIO_togglePins(LED_PORT, LED_PA0_PIN); break; default: break; } } void UART_0_INST_IRQHandler(void) { switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) { case DL_UART_MAIN_IIDX_DMA_DONE_RX: gCheckUART = true; break; default: break; } }