/* * 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 "ti_msp_dl_config.h" #include "delay.h" #include "mt6701.h" #include "dfoc.h" #include #include #include #include "config.h" #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.6); DL_SYSTICK_resetValue(); while(1) { //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; } }