实习记录(四):完善触发器 & 去除同步板毛刺

完善触发器 & 去除同步板毛刺

2020.08.04~2020.08.07

1.任务

1)触发器可以选择管脚输出,并且实现轮番发送信息实现多个管脚依次触发
2)同步板毛刺去除

2.环境 & 工具

ubuntu16.04
ROS kinetic
Windows
keil
STM32CubeMX
FluMcu
示波器

3.准备工作

1)翻出上周的触发器代码
2)翻出上周的同步板测试记录

4.方案

1)增加一个判断函数,新增管脚的初始化

/* USER CODE END WHILE */
    char rx_message[RXSIZE] = {0};

    /* USER CODE END 2 */

    HAL_UART_Receive(&huart1, (uint8_t *)&rx_message, RXSIZE, 0xffff);
    // HAL_UART_Transmit(&huart1, (uint8_t *)&rx_message, RXSIZE, 0xffff);
    // while (HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_RX);

    PPS_trasmitter(rx_message);

    /* USER CODE BEGIN 3 */

/* USER CODE BEGIN 4 */
void PPS_trasmitter(char *message) {
  uint16_t rx_int = 0;
  uint8_t choose_pin = -1;

  choose_pin = (int)message[0] - 48;

  for (int i = 1; i < RXSIZE; i++) {
    rx_int = rx_int + ((int)message[i] - 48) * pow(10, RXSIZE - i - 1);
  }

  switch (choose_pin) {
  case 0:
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
    break;

  case 1:
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
    break;

  case 2:
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
    break;

  case 3:
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
    break;

  case 4:
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
    break;

  case 5:
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
    break;

  case 6:
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
    break;

  case 7:
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);
    break;

  case 8:
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
    break;

  case 9:
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
    HAL_Delay(rx_int);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
    break;

  default:
    break;
  }
}
/* USER CODE END 4 */




2)代码看通了,再结合测试一看,显而易见毛刺的直接原因就是校正,但校正不能丢啊。
还是很简单,校正错位半个波形就没毛刺了。具体操作就是动一些变量的位置。


结语:
本来触发器想用freertos任务调度重构实现类似多线程的效果,这样触发器接收信息和发送方波就能同时进行,但时间要求比较仓促,最后只好先用单线程写了个。
同步板的原代码差点看不下去,全都堆在main.c中,测试用代码都没注释掉,没有一句注释,这所谓的前同事代码怕不是传说中的shi山代码,反复看了几遍,才慢慢理解代码逻辑,好歹终于看见了问题所在。

注:本文为自用实习记录

猜你喜欢

转载自blog.csdn.net/o66oCZRo99o/article/details/107936761