电机控制
直播中

jyaxz

12年用户 430经验值
擅长:嵌入式技术
私信 关注
[文章]

【STSPIN32F0601 电机控制板试用体验连载】关键外设接口测试

关键外设接口测试
为了完成驱动测试前的准备工作,对如下几个关键部分进行测试:AD采样,霍尔位置获取,串口通讯。由于STSPIN32F0610将MOS开关的主要驱动部分封装到了芯片内部,所以没有办法直接测试到。
1.    AD采样测试
1.jpg
      从图种可以看到,母线VBUS的测量使用PA0端口,对应AD输入IN0 。
2.jpg
      AD的参数配置
3.jpg
实测结果:
4.jpg
实际AD采样数据为0x37a左右跳动,VBUS的取样电阻变比为201.
VDC = VBUS /4096 * 3.3 * 201 = 144.1V左右
我交流输入端加入AC115V,整流后约为115*1.414 *0.9= 146.35VDC。
实际测量直流总线电压为152.5VDC。基本证明了总线电压取样电阻的分压回路和采集回路是正确了。
2.    霍尔位置获取测试
霍尔信号输入经过输入回路后,接入控制器的PA4,PA5,PA6三个引脚。
5.jpg
参数配置:
6.jpg
霍尔输入GPIO配置为外部中断模式,响应上升沿和下降沿。并且配置外部中断。
7.jpg
使能EXti line 4 to15 interrupts的中断。
实际测试:
8.jpg
PA4、PA5和PA6组成一个3位的数字,旋转电机的时候,可以观察到霍伟位置的变化。
实际使用霍尔信号进行速度采集的时候还可以采用定时器的XOR功能触发CC1捕获来完成,在后面的电机驱动测试中,会采用TIM3完成霍尔信号速度采集。
3.    串口测试
串口通讯是将来系统调试的主要手段,所以完成串口测试对于后面的系统调试很重要。
9.jpg
      如图所示,串口的收发两线接到PB7和PB6两个IO口上。
      串口配置:
10.jpg
11.jpg
实测结果:
前述两个测试都是采用串口展示的结果,说明串口通讯已经实际起到作用。
串口使用过程中遇到的问题总结:
      STM32CubeMx生成的串口驱动代码中,对于收发引脚的初始化如下:

  1. /**
  2.   *@Brief USART1 Initialization Function
  3.   *@param None
  4.   *@retval None
  5.   */
  6. static void MX_USART1_UART_Init(void)
  7. {

  8.   /*USER CODE BEGIN USART1_Init 0 */

  9.   /*USER CODE END USART1_Init 0 */

  10. LL_USART_InitTypeDef USART_InitStruct = {0};

  11. LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  12.   /*Peripheral clock enable */
  13. LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1);

  14. LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
  15. /**USART1 GPIO Configuration
  16. PB6   ------> USART1_TX
  17. PB7   ------> USART1_RX
  18.   */
  19. GPIO_InitStruct.Pin = UART_TX_Pin;
  20. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  21. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  22. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  23. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  24. GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  25.   LL_GPIO_Init(UART_TX_GPIO_Port,&GPIO_InitStruct);

  26. GPIO_InitStruct.Pin = UART_RX_Pin;
  27. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  28. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  29. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  30. GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  31. GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  32. LL_GPIO_Init(UART_RX_GPIO_Port, &GPIO_InitStruct);

  33.   /*USER CODE BEGIN USART1_Init 1 */

  34.   /*USER CODE END USART1_Init 1 */
  35. USART_InitStruct.BaudRate = 9600;
  36. USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  37. USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  38. USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  39. USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  40. USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  41. USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  42. LL_USART_Init(USART1, &USART_InitStruct);
  43. LL_USART_DisableIT_CTS(USART1);
  44. LL_USART_ConfigAsyncMode(USART1);
  45. LL_USART_Enable(USART1);
  46.   /*USER CODE BEGIN USART1_Init 2 */
  47.   /*USER CODE END USART1_Init 2 */
  48. }

实际的使用过程中会发现,发送数据是正常的,但是接收数据不正确,表现为可以正确的产生接收中断,但是接收到的数据全是0,经过仔细的检查硬件回路,没有出现接收引脚虚焊、短路的现象,排除了硬件故障的影响,也就是说问题还是出在软件设计上,最终发现,接收引脚的配置中,只要将引脚上拉打开,一切问题都解决了。
  1. GPIO_InitStruct.Pin = UART_RX_Pin;
  2. GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  3. GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  4. GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  5. GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  6. GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  7. LL_GPIO_Init(UART_RX_GPIO_Port, &GPIO_InitStruct);

以后在f0的设计使用上要注意这一点。

回帖(1)

阳光

2020-11-3 09:29:01
感谢楼主无私分享!!!!!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分