1.概述

在自己创建工程之后,开始了对TT_M3HQ开发板的学习,主要功能是使用TT_M3HQ开发板实现对57式步进电机的控制,包括电机启停、方向控制、电机转速控制等。在学习的过程当中主要涉及到了系统时钟各个配置、GPIO功能、SysTick功能、UART功能、定时器功能和PWM功能。通过对原厂代码的解读,逐步了解了这些所涉及功能模块的初始化配置、及后面的操作;原厂的代码在BSP部分结合硬件做了程序的结构定义及封装,对代码来说理简洁,但对于我这个刚开始的新手来说,我还是一点点的去分析,然后改写成了自己的代码风格,对原厂代码设计巧妙的地方也分享给其它同事一起学习了……

本例程基于TT_M3HQ开发板主要实现的功能如下:
——初始化系统时钟,使其工作在80MHz的主频率下,实际测得大概是79880000Hz,通过SCOU对系统各个时钟模块进行监测;
——初始化GPIO口,通过串口命令实现对LED亮灭的控制、电机的运行使能和运转方向控制;
——初始化定时器定时功能,在定时器的中断回调函数中实现对变通GPIO的电平翻转操作,监测定时器的中断触发时间间隔;
——初始化定时器脉冲输出,实现对57式步进电机运转输入信号的控制;
——初始化串口功能,实现系统消息打印,接收PC的串口命令进行相应的操作;
——初始化SysTick,实现1ms的精确延时;

2.准备

2.1.搭建硬件环境

1.jpg 4.jpg 6.jpg

2.2.电机参数

电机型号:57BYG250B
电流:3A
输出力矩:1.2Nm(牛米)
机身长度:56mm
出轴长度:21mm
出轴方式:单轴,轴径8mm,单扁丝
出线方式:二相四根引出线(黑色A+ 绿色A- 红色B+ 蓝色B-)

2.3.驱动器参数

驱动器型号:TB6600
输入电压:DC 9V~24V
电流:4A 速度自适应电路,电流自动寻优
细分数:6400细分
各种保护:过流、过压、欠压、短路等保护
脱机:脱机(ENA)保护功能

3.程序设计

3.1.LED灯初始化及控制
  1. static void TT_M3HQ_InitLED(void)
  2. {
  3.     port.p_pk_instance = TSB_PK;
  4.     if(gpio_init(&port, GPIO_PORT_K) != TXZ_SUCCESS)
  5.     {
  6.         TT_M3HQ_Warning();
  7.     }
  8.     /* PK4 - LED0 */
  9.     if(gpio_func(&port, GPIO_PORT_K, GPIO_PORT_4, (uint32_t)GPIO_PK4_OUTPUT, GPIO_PIN_OUTPUT) != TXZ_SUCCESS)
  10.     {
  11.         TT_M3HQ_Warning();
  12.     }
  13.     /* PK5 - LED1 */
  14.     if(gpio_func(&port, GPIO_PORT_K, GPIO_PORT_5, (uint32_t)GPIO_PK5_OUTPUT, GPIO_PIN_OUTPUT) != TXZ_SUCCESS)
  15.     {
  16.         TT_M3HQ_Warning();
  17.     }
  18.     /* PK6 - LED2 */
  19.     if(gpio_func(&port, GPIO_PORT_K, GPIO_PORT_6, (uint32_t)GPIO_PK6_OUTPUT, GPIO_PIN_OUTPUT) != TXZ_SUCCESS)
  20.     {
  21.         TT_M3HQ_Warning();
  22.     }
  23.     /* PK7 - LED3 */
  24.     if(gpio_func(&port, GPIO_PORT_K, GPIO_PORT_7, (uint32_t)GPIO_PK7_OUTPUT, GPIO_PIN_OUTPUT) != TXZ_SUCCESS)
  25.     {
  26.         TT_M3HQ_Warning();
  27.     }
  28. }
  29. void TT_M3HQ_LEDOnOFF(uint8_t index, uint8_t state)
  30. {
  31.     if(state)
  32.     {
  33.         switch(index)
  34.         {
  35.             case 0 : gpio_write_bit(&port, GPIO_PORT_K, GPIO_PORT_4, GPIO_Mode_DATA, GPIO_PIN_SET);   break;
  36.             case 1 : gpio_write_bit(&port, GPIO_PORT_K, GPIO_PORT_5, GPIO_Mode_DATA, GPIO_PIN_SET);   break;
  37.             case 2 : gpio_write_bit(&port, GPIO_PORT_K, GPIO_PORT_6, GPIO_Mode_DATA, GPIO_PIN_SET);   break;
  38.             case 3 : gpio_write_bit(&port, GPIO_PORT_K, GPIO_PORT_7, GPIO_Mode_DATA, GPIO_PIN_SET);   break;
  39.             default: break;
  40.         }
  41.     }
  42.     else
  43.     {
  44.         switch(index)
  45.         {
  46.             case 0 : gpio_write_bit(&port, GPIO_PORT_K, GPIO_PORT_4, GPIO_Mode_DATA, GPIO_PIN_RESET); break;
  47.             case 1 : gpio_write_bit(&port, GPIO_PORT_K, GPIO_PORT_5, GPIO_Mode_DATA, GPIO_PIN_RESET); break;
  48.             case 2 : gpio_write_bit(&port, GPIO_PORT_K, GPIO_PORT_6, GPIO_Mode_DATA, GPIO_PIN_RESET); break;
  49.             case 3 : gpio_write_bit(&port, GPIO_PORT_K, GPIO_PORT_7, GPIO_Mode_DATA, GPIO_PIN_RESET); break;
  50.             default: break;
  51.         }
  52.     }
  53. }

3.2.定时器功能初始化及中断回调函数
  1. static void TT_M3HQ_TimerEventHandler(uint32_t id, uint32_t status, TXZ_Result result)
  2. {
  3.     static uint8_t i = 0;
  4.     if(result == TXZ_SUCCESS)
  5.     {
  6.         if((status & T32A_INTx1_FLG_MASK) == T32A_INTx1_FLG_MASK)
  7.         {
  8.             if(i == 0)
  9.             {
  10.                 i = 1;
  11.                 gpio_write_bit(&port, GPIO_PORT_N, GPIO_PORT_4, GPIO_Mode_DATA, GPIO_PIN_SET);
  12.             }
  13.             else
  14.             {
  15.                 i = 0;
  16.                 gpio_write_bit(&port, GPIO_PORT_N, GPIO_PORT_4, GPIO_Mode_DATA, GPIO_PIN_RESET);
  17.             }
  18.         }
  19.     }
  20. }
  21. static void TT_M3HQ_TimerStart(void)
  22. {
  23.     /*--- Start       ---*/
  24.     if(t32a_timer_startIT(&t32a,   T32A_TIMERA) != TXZ_SUCCESS)
  25.     {
  26.         TT_M3HQ_Warning();
  27.     }
  28.     if(t32a_SWcounter_start(&t32a, T32A_TIMERA) != TXZ_SUCCESS)
  29.     {
  30.         TT_M3HQ_Warning();
  31.     }
  32.     /*--- NVIC Enable ---*/
  33.     NVIC_EnableIRQ(INTT32A00A_IRQn);
  34. }
  35. static void TT_M3HQ_TimerStop(void)
  36. {
  37.     /*--- NVIC Disable ---*/
  38.     NVIC_DisableIRQ(INTT32A00A_IRQn);
  39.     /*--- Stop         ---*/
  40.     if (t32a_timer_stopIT(&t32a,   T32A_TIMERA) != TXZ_SUCCESS)
  41.     {
  42.         TT_M3HQ_Warning();
  43.     }
  44.     if (t32a_SWcounter_stop(&t32a, T32A_TIMERA) != TXZ_SUCCESS)
  45.     {
  46.         TT_M3HQ_Warning();
  47.     }
  48. }
  49. static void TT_M3HQ_InitTimer(void)
  50. {
  51.     uint8_t flag = 1;
  52.     cg_t paramCG;
  53.     t32a.p_instance                         = TSB_T32A0;
  54.     t32a.init_mode.mode.halt                = T32A_DBG_HALT_STOP;
  55.     t32a.init_mode.mode.mode                = T32A_MODE_16;
  56.     if(t32a_mode_init(&t32a) != TXZ_SUCCESS)
  57.     {
  58.         TT_M3HQ_Warning();
  59.     }
  60.     /* Run Control      */
  61.     t32a.init[T32A_TIMERA].runx.sftstp      = T32A_COUNT_STOP;
  62.     t32a.init[T32A_TIMERA].runx.sftsta      = T32A_COUNT_DONT_START;
  63.     t32a.init[T32A_TIMERA].runx.run         = T32A_RUN_DISABLE;
  64.     /* Counter Control  */
  65.     t32a.init[T32A_TIMERA].crx.prscl        = T32A_PRSCLx_8;
  66.     t32a.init[T32A_TIMERA].crx.clk          = T32A_CLKx_PRSCLx;
  67.     t32a.init[T32A_TIMERA].crx.wbf          = T32A_WBF_DISABLE;
  68.     t32a.init[T32A_TIMERA].crx.updn         = T32A_COUNT_DOWN;
  69.     t32a.init[T32A_TIMERA].crx.reld         = T32A_RELOAD_TREGx;
  70.     t32a.init[T32A_TIMERA].crx.stop         = T32A_STOP_NON;
  71.     t32a.init[T32A_TIMERA].crx.start        = T32A_START_NON;
  72.     /* Output Control 0 */
  73.     t32a.init[T32A_TIMERA].outcrx0.ocr      = T32A_OCR_DISABLE;
  74.     /* Output Control 1 */
  75.     t32a.init[T32A_TIMERA].outcrx1.ocrcap0  = T32A_OCRCAPx0_DISABLE;
  76.     t32a.init[T32A_TIMERA].outcrx1.ocrcap1  = T32A_OCRCAPx1_DISABLE;
  77.     t32a.init[T32A_TIMERA].outcrx1.ocrcmp0  = T32A_OCRCMPx0_DISABLE;
  78.     t32a.init[T32A_TIMERA].outcrx1.ocrcmp1  = T32A_OCRCMPx1_DISABLE;
  79.     /* Timer Counter 1  */
  80.     t32a.init[T32A_TIMERA].rgx0.rgx0        = 0;
  81.     t32a.init[T32A_TIMERA].rgx1.rgx1        = 0;
  82.     /* Counter Capture  */
  83.     t32a.init[T32A_TIMERA].tmrx.tmrx        = 0;
  84.     /* Counter Capture Control A0  */
  85.     t32a.init[T32A_TIMERA].capx0.capx0      = 0;
  86.     /* Counter Capture Control A1  */
  87.     t32a.init[T32A_TIMERA].capx1.capx1      = 0;
  88.     /* Interrupt mask register Set */
  89.     t32a.init[T32A_TIMERA].imx.imuf         = T32A_IMUFx_MASK_REQ;
  90.     t32a.init[T32A_TIMERA].imx.imof         = T32A_IMOFx_MASK_REQ;
  91.     t32a.init[T32A_TIMERA].imx.imx1         = T32A_IMx1_MASK_NOREQ;
  92.     t32a.init[T32A_TIMERA].imx.imx0         = T32A_IMx0_MASK_REQ;
  93.     /* DMA Request      */
  94.     t32a.init[T32A_TIMERA].dma_req.dmaenx2  = T32A_DMAENx2_DISABLE;
  95.     t32a.init[T32A_TIMERA].dma_req.dmaenx1  = T32A_DMAENx1_DISABLE;
  96.     t32a.init[T32A_TIMERA].dma_req.dmaenx0  = T32A_DMAENx0_DISABLE;
  97.     /* User ID          */
  98.     t32a.init[T32A_TIMERA].id               = 0;
  99.     /* Handler          */
  100.     t32a.init[T32A_TIMERA].handler_T        = TT_M3HQ_TimerEventHandler;
  101.     /* CG Driver Register Address Allocation. */
  102.     paramCG.p_instance = TSB_CG;
  103.     /* Calculate timer counter. */
  104.     if(t32a_Calculator(&(t32a.init[T32A_TIMERA].reldx.reld), 1000, cg_get_phyt0(¶mCG), t32a.init[T32A_TIMERA].crx.prscl) != TXZ_SUCCESS)
  105.     {
  106.         TT_M3HQ_Warning();  TT_M3HQ_LEDOnOFF(0, 1);
  107.     }
  108.     if(t32a_timer_init(&t32a, T32A_TIMERA) != TXZ_SUCCESS)
  109.     {
  110.         TT_M3HQ_Warning();
  111.     }
  112.     if(flag) TT_M3HQ_TimerStart();
  113.     else     TT_M3HQ_TimerStop();
  114. }


3.3.定时器脉冲输出配置
  1. static void TT_M3HQ_PulseHandler(uint32_t id, uint32_t status, TXZ_Result result)
  2. {
  3.     if(result == TXZ_SUCCESS)
  4.     {
  5.         /* Check INTA1 */
  6.         if((status & T32A_INTx1_FLG_MASK) == T32A_INTx1_FLG_MASK)
  7.         {
  8.         }
  9.     }
  10. }
  11. static void TT_M3HQ_PulseTimerStart(void)
  12. {
  13.     /*--- Start       ---*/
  14.     if(t32a_timer_startIT(&pulse,   T32A_TIMERA) != TXZ_SUCCESS)
  15.     {
  16.         TT_M3HQ_Warning();
  17.     }
  18.     if(t32a_SWcounter_start(&pulse, T32A_TIMERA) != TXZ_SUCCESS)
  19.     {
  20.         TT_M3HQ_Warning();
  21.     }
  22.     /*--- NVIC Enable ---*/
  23.     NVIC_EnableIRQ(INTT32A03A_IRQn);
  24. }
  25. static void TT_M3HQ_PulseTimerStop(void)
  26. {
  27.     /*--- NVIC Disable ---*/
  28.     NVIC_DisableIRQ(INTT32A03A_IRQn);
  29.     /*--- Stop         ---*/
  30.     if(t32a_timer_stopIT(&pulse,   T32A_TIMERA) != TXZ_SUCCESS)
  31.     {
  32.         TT_M3HQ_Warning();
  33.     }
  34.     if(t32a_SWcounter_stop(&pulse, T32A_TIMERA) != TXZ_SUCCESS)
  35.     {
  36.         TT_M3HQ_Warning();
  37.     }
  38. }
  39. static void TT_M3HQ_InitPulse(void)
  40. {
  41.     uint8_t flag = 1;
  42.     cg_t paramCG;
  43.     port.p_pj_instance = TSB_PJ;
  44.     if(gpio_init(&port, GPIO_PORT_J) != TXZ_SUCCESS)
  45.     {
  46.         TT_M3HQ_Warning();
  47.     }
  48.     /* PJ0 - PUL */
  49.     if(gpio_func(&port, GPIO_PORT_J, GPIO_PORT_0, (uint32_t)GPIO_PJ0_T32A03OUTA, GPIO_PIN_OUTPUT) != TXZ_SUCCESS)
  50.     {
  51.         TT_M3HQ_Warning();
  52.     }
  53.     /* PJ3 - DIR */
  54.     if(gpio_func(&port, GPIO_PORT_J, GPIO_PORT_3, (uint32_t)GPIO_PN3_OUTPUT, GPIO_PIN_OUTPUT) != TXZ_SUCCESS)
  55.     {
  56.         TT_M3HQ_Warning();
  57.     }
  58.     /* PJ5 - ENA */
  59.     if(gpio_func(&port, GPIO_PORT_J, GPIO_PORT_5, (uint32_t)GPIO_PN5_OUTPUT, GPIO_PIN_OUTPUT) != TXZ_SUCCESS)
  60.     {
  61.         TT_M3HQ_Warning();
  62.     }
  63.     TT_M3HQ_MotorRUN(0);
  64.     TT_M3HQ_MotorDIR(0);
  65.     pulse.p_instance          = TSB_T32A3;
  66.     pulse.init_mode.mode.halt = T32A_DBG_HALT_STOP;
  67.     pulse.init_mode.mode.mode = T32A_MODE_16;
  68.     if(t32a_mode_init(&pulse) != TXZ_SUCCESS)
  69.     {
  70.         TT_M3HQ_Warning();
  71.     }
  72.     /* Run Control      */
  73.     pulse.init[T32A_TIMERA].runx.sftstp         = T32A_COUNT_STOP;
  74.     pulse.init[T32A_TIMERA].runx.sftsta         = T32A_COUNT_DONT_START;
  75.     pulse.init[T32A_TIMERA].runx.run            = T32A_RUN_DISABLE;
  76.     /* Counter Control  */
  77.     pulse.init[T32A_TIMERA].crx.prscl           = T32A_PRSCLx_8;
  78.     pulse.init[T32A_TIMERA].crx.clk             = T32A_CLKx_PRSCLx;
  79.     pulse.init[T32A_TIMERA].crx.wbf             = T32A_WBF_DISABLE;
  80.     pulse.init[T32A_TIMERA].crx.updn            = T32A_COUNT_UP;
  81.     pulse.init[T32A_TIMERA].crx.reld            = T32A_RELOAD_TREGx;
  82.     pulse.init[T32A_TIMERA].crx.stop            = T32A_STOP_NON;
  83.     pulse.init[T32A_TIMERA].crx.start           = T32A_START_NON;
  84.     /* Output Control 0 */
  85.     pulse.init[T32A_TIMERA].outcrx0.ocr         = T32A_OCR_DISABLE;
  86.     /* Output Control 1 */
  87.     pulse.init[T32A_TIMERA].outcrx1.ocrcap1     = T32A_OCRCAPx1_DISABLE;
  88.     pulse.init[T32A_TIMERA].outcrx1.ocrcap0     = T32A_OCRCAPx0_DISABLE;
  89.     pulse.init[T32A_TIMERA].outcrx1.ocrcmp1     = T32A_OCRCMPx1_CLR;
  90.     pulse.init[T32A_TIMERA].outcrx1.ocrcmp0     = T32A_OCRCMPx0_SET;
  91.     /* Counter Capture  */
  92.     pulse.init[T32A_TIMERA].tmrx.tmrx           = 0;
  93.     /* Counter Capture Control A0  */
  94.     pulse.init[T32A_TIMERA].capx0.capx0         = 0;
  95.     /* Counter Capture Control A1  */
  96.     pulse.init[T32A_TIMERA].capx1.capx1         = 0;
  97.     /* Interrupt mask register Set */
  98.     pulse.init[T32A_TIMERA].imx.imuf            = T32A_IMUFx_MASK_REQ;
  99.     pulse.init[T32A_TIMERA].imx.imof            = T32A_IMOFx_MASK_REQ;
  100.     pulse.init[T32A_TIMERA].imx.imx1            = T32A_IMx1_MASK_NOREQ;
  101.     pulse.init[T32A_TIMERA].imx.imx0            = T32A_IMx0_MASK_NOREQ;
  102.     /* DMA Request      */
  103.     pulse.init[T32A_TIMERA].dma_req.dmaenx2     = T32A_DMAENx2_DISABLE;
  104.     pulse.init[T32A_TIMERA].dma_req.dmaenx1     = T32A_DMAENx1_DISABLE;
  105.     pulse.init[T32A_TIMERA].dma_req.dmaenx0     = T32A_DMAENx0_DISABLE;
  106.     /* User ID          */
  107.     pulse.init[T32A_TIMERA].id                  = 0;
  108.     /* Handler          */
  109.     pulse.init[T32A_TIMERA].handler_T           = TT_M3HQ_PulseHandler;
  110.     /* CG Driver Register Address Allocation. */
  111.     paramCG.p_instance = TSB_CG;
  112.     // 100us
  113.     if(t32a_Calculator(&pulse.init[T32A_TIMERA].rgx0.rgx0, 100, cg_get_phyt0(¶mCG), pulse.init[T32A_TIMERA].crx.prscl) != TXZ_SUCCESS)
  114.     {
  115.         TT_M3HQ_Warning();
  116.     }
  117.     // 200us --> Freq : 5kHz
  118.     if(t32a_Calculator(&pulse.init[T32A_TIMERA].rgx1.rgx1, 200, cg_get_phyt0(¶mCG), pulse.init[T32A_TIMERA].crx.prscl) != TXZ_SUCCESS)
  119.     {
  120.         TT_M3HQ_Warning();
  121.     }
  122.     if (t32a_timer_init(&pulse, T32A_TIMERA) != TXZ_SUCCESS)
  123.     {
  124.         TT_M3HQ_Warning();
  125.     }
  126.     if(flag) TT_M3HQ_PulseTimerStart();
  127.     else     TT_M3HQ_PulseTimerStop();
  128. }

3.4.串口初始化
  1. static void TT_M3HQ_UART0_TxHandler(uint32_t id, TXZ_Result result)
  2. {
  3. }
  4. static void TT_M3HQ_UART0_RxHandler(uint32_t id, TXZ_Result result, uart_receive_t *p_info)
  5. {
  6.     uint32_t i = 0;
  7.     if(result == TXZ_SUCCESS)
  8.     {
  9.         for(i = 0; i < p_info->rx8.num; i++)
  10.         {
  11.             QUEUE_WRITE(QUEUE_DEBUG_RX_IDX, p_info->rx8.p_data[i]);
  12.         }
  13.     }
  14. }
  15. static void TT_M3HQ_InitUART0(void)
  16. {
  17.     cg_t paramCG;
  18.     paramCG.p_instance = TSB_CG;
  19.     port.p_pa_instance = TSB_PA;
  20.     if(gpio_init(&port, GPIO_PORT_A) != TXZ_SUCCESS)
  21.     {
  22.         TT_M3HQ_Warning();
  23.     }
  24.     /* PA1 - UART0 TXD */
  25.     if(gpio_func(&port, GPIO_PORT_A, GPIO_PORT_1, (uint32_t)GPIO_PA1_UT0TXDA, GPIO_PIN_OUTPUT) != TXZ_SUCCESS)
  26.     {
  27.         TT_M3HQ_Warning();
  28.     }
  29.     /* PA2 - UART0 RXD */
  30.     if(gpio_func(&port, GPIO_PORT_A, GPIO_PORT_2, (uint32_t)GPIO_PA2_UT0RXD, GPIO_PIN_INPUT)   != TXZ_SUCCESS)
  31.     {
  32.         TT_M3HQ_Warning();
  33.     }
  34.     uart0.p_instance        = TSB_UART0;
  35.     uart0.init.id           = 0;
  36.     uart0.init.clock.prsel  = UART_PLESCALER_1;
  37.     if(uart_get_boudrate_setting(cg_get_phyt0(¶mCG), &uart0.init.clock, 115200,  &uart0.init.boudrate) != TXZ_SUCCESS)
  38.     {
  39.         TT_M3HQ_Warning();
  40.     }
  41.     uart0.init.inttx         = UART_TX_INT_ENABLE;
  42.     uart0.init.intrx         = UART_RX_INT_ENABLE;
  43.     uart0.init.interr        = UART_ERR_INT_ENABLE;
  44.     uart0.init.txfifo.inttx  = UART_TX_FIFO_INT_DISABLE;
  45.     uart0.init.txfifo.level  = 0;
  46.     uart0.init.rxfifo.intrx  = UART_RX_FIFO_INT_DISABLE;
  47.     uart0.init.rxfifo.level  = 8;
  48.     uart0.init.nf            = UART_NOISE_FILTER_NON;
  49.     uart0.init.ctse          = UART_CTS_DISABLE;
  50.     uart0.init.rtse          = UART_RTS_DISABLE;
  51.     uart0.init.iv            = UART_DATA_COMPLEMENTION_DISABLE;
  52.     uart0.init.dir           = UART_DATA_DIRECTION_LSB;
  53.     uart0.init.sblen         = UART_STOP_BIT_1;
  54.     uart0.init.even          = UART_PARITY_BIT_ODD;
  55.     uart0.init.pe            = UART_PARITY_DISABLE;
  56.     uart0.init.sm            = UART_DATA_LENGTH_8;
  57.     uart0.transmit.handler   = TT_M3HQ_UART0_TxHandler;
  58.     uart0.receive.handler    = TT_M3HQ_UART0_RxHandler;
  59.     if(uart_init(&uart0) != TXZ_SUCCESS)
  60.     {
  61.         TT_M3HQ_Warning();
  62.     }
  63.     {
  64.         uart_receive_t rx;
  65.         rx.rx8.p_data = UART0_Buffer;
  66.         rx.rx8.num    = 100;
  67.         if(uart_receiveIt(&uart0, &rx) != TXZ_SUCCESS)
  68.         {
  69.             TT_M3HQ_Warning();
  70.         }
  71.     }
  72.     NVIC_EnableIRQ(INTUART0RX_IRQn);
  73.     NVIC_EnableIRQ(INTUART0TX_IRQn);
  74.     NVIC_EnableIRQ(INTUART0ERR_IRQn);
  75. }

3.5.电机运转使能、方向和速度控制
  1. void TT_M3HQ_MotorDIR(uint32_t dir)
  2. {
  3.     if(dir)
  4.     {
  5.         gpio_write_bit(&port, GPIO_PORT_J, GPIO_PORT_3, GPIO_Mode_DATA, GPIO_PIN_RESET);    // DIR 顺时针
  6.     }
  7.     else
  8.     {
  9.         gpio_write_bit(&port, GPIO_PORT_J, GPIO_PORT_3, GPIO_Mode_DATA, GPIO_PIN_SET);      // DIR 逆时针
  10.     }
  11. }
  12. void TT_M3HQ_MotorPUL(uint32_t Hz)
  13. {
  14.     cg_t paramCG;
  15.     uint32_t rgx0 = 0;
  16.     uint32_t rgx1 = 0;
  17.     uint32_t time = 1000 * 1000 / Hz;
  18.     /* CG Driver Register Address Allocation. */
  19.     paramCG.p_instance = TSB_CG;
  20.     if(t32a_Calculator(&rgx0, (time / 2), cg_get_phyt0(¶mCG), pulse.init[T32A_TIMERA].crx.prscl) != TXZ_SUCCESS)
  21.     {
  22.         TT_M3HQ_Warning();
  23.     }
  24.     if(t32a_Calculator(&rgx1, (time / 1), cg_get_phyt0(¶mCG), pulse.init[T32A_TIMERA].crx.prscl) != TXZ_SUCCESS)
  25.     {
  26.         TT_M3HQ_Warning();
  27.     }
  28.     /* T32A Timer Register A0 Set */
  29.     pulse.p_instance->RGA0 = 0;
  30.     pulse.p_instance->RGA0 = rgx0;
  31.     /* T32A Timer Register A1 Set */
  32.     pulse.p_instance->RGA1 = 0;
  33.     pulse.p_instance->RGA1 = rgx1;
  34. }
  35. void TT_M3HQ_MotorRUN(uint32_t en)
  36. {
  37.     if(en)
  38.     {
  39.         gpio_write_bit(&port, GPIO_PORT_J, GPIO_PORT_5, GPIO_Mode_DATA, GPIO_PIN_SET);      // ENA 使能
  40.     }
  41.     else
  42.     {
  43.         gpio_write_bit(&port, GPIO_PORT_J, GPIO_PORT_5, GPIO_Mode_DATA, GPIO_PIN_RESET);    // ENA 禁止
  44.     }
  45. }

3.6.PC控制命令解析和执行
  1. static void MessageHandler(void)
  2. {
  3.     uint8_t  i = 0;
  4.     static uint32_t frequency = 5000;
  5.     if(QUEUE_EMPTY(QUEUE_DEBUG_RX_IDX) == 0)
  6.     {
  7.         gucDebugBuffer[guiDebugLength++] = QUEUE_READ(QUEUE_DEBUG_RX_IDX);
  8.         if(strncmp((char *)(gucDebugBuffer + guiDebugLength - 2), "\r\n", 2) == 0)
  9.         {
  10.             if(strcmp((char *)gucDebugBuffer, "\r\n") == 0)
  11.             {
  12.                 printf("\r\nEmpty Line");
  13.             }
  14.             else
  15.             {
  16.                 char *line = strtok((char *)gucDebugBuffer, "\r\n");
  17.                 if(     strcmp(line, "start") == 0) TT_M3HQ_MotorRUN(1);
  18.                 else if(strcmp(line, "stop" ) == 0) TT_M3HQ_MotorRUN(0);
  19.                 else if(strcmp(line, "dir=1") == 0) TT_M3HQ_MotorDIR(1);
  20.                 else if(strcmp(line, "dir=0") == 0) TT_M3HQ_MotorDIR(0);
  21.                 else if(strcmp(line, "led=1") == 0) {for(i = 0; i < 4; i++) TT_M3HQ_LEDOnOFF(i, 1);}
  22.                 else if(strcmp(line, "led=0") == 0) {for(i = 0; i < 4; i++) TT_M3HQ_LEDOnOFF(i, 0);}
  23.                 else if(strcmp(line, "rgx++") == 0) {frequency += 500; TT_M3HQ_MotorPUL(frequency);}
  24.                 else if(strcmp(line, "rgx--") == 0) {frequency -= 500; TT_M3HQ_MotorPUL(frequency);}
  25.                 else printf("\r\nInvalid command");
  26.                 printf("\r\n%s", line);
  27.             }
  28.             guiDebugLength = 0;
  29.             memset(gucDebugBuffer, 0, sizeof(gucDebugBuffer));
  30.         }
  31.     }
  32. }

4.调试运行

4.1.PC调试软件及控制指令

3.png

4.2.电机运转在500Hz的频率下

4.BMP

4.3.电机运转在13kHz的频率下

5.BMP

5.关于SCOU输出的疑问

参照原厂的代码,external_losc_enable如果调用,SCOUT选择fs,烧录程序后复位运行,SCOUT有32.768kHz的频率输出;这个时候如果不调用external_losc_enable,SCOUT选择fs,烧录程序后复位运行,SCOUT仍然有32.768kHz的频率输出;只的在整个板子断电后再上电运行,SCOUT才没有输出;也就是说,复位对选择fs进行SCOUT输出没有影响,这是正常现象吗?

6.工程代码

Project.rar (4.11 MB, 下载次数: 13)
全部回复 3
  • 16 主题
  • 48 帖子
  • 893 积分
身份:LV3 中级技术员
E币:622
感谢楼主分享
  • 0 主题
  • 30 帖子
  • 1353 积分
身份:LV4 高级技术员
E币:961
感谢分享,很有用。
  • 0 主题
  • 2 帖子
  • 104 积分
身份:LV1 技术小白
E币:101
你好。我在使用TT_M3HQ时,遇到了一个问题。mbed在线打包的bin文件,复制到TT_M3HQ优盘后,无法录进去。但新增了一个FAIL.txt文件,内容为“The transfer timed out.”,请问如何解决??
回复楼主
您需要登录后才可以评论 登录 立即注册