完善触发器 & 去除同步板毛刺
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山代码,反复看了几遍,才慢慢理解代码逻辑,好歹终于看见了问题所在。
注:本文为自用实习记录