/* * 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 = 20; // 串口目标值 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.6); DL_SYSTICK_resetValue(); while (1) { // DL_GPIO_togglePins(LED_PORT, LED_PA0_PIN); // delay_ms(10); // 开环 velocityopenloop(Target); // //test MT6701 // MT6701_get_angle_degree(); // printf("angle degree is %f \n", angle_f); // // 闭环 // Set_Angle(Target); if (gCheckUART) { gCheckUART = false; parse_uart_cmd(); } } } 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; } }