关键外设接口测试
为了完成驱动测试前的准备工作,对如下几个关键部分进行测试:AD采样,霍尔位置获取,串口通讯。由于STSPIN32F0610将MOS开关的主要驱动部分封装到了芯片内部,所以没有办法直接测试到。
1. AD采样测试 从图种可以看到,母线VBUS的测量使用PA0端口,对应AD输入IN0 。
AD的参数配置
实测结果:
实际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三个引脚。
参数配置:
霍尔输入GPIO配置为外部中断模式,响应上升沿和下降沿。并且配置外部中断。
使能EXti line 4 to15 interrupts的中断。 实际测试:
PA4、PA5和PA6组成一个3位的数字,旋转电机的时候,可以观察到霍伟位置的变化。
实际使用霍尔信号进行速度采集的时候还可以采用定时器的XOR功能触发CC1捕获来完成,在后面的电机驱动测试中,会采用TIM3完成霍尔信号速度采集。
3. 串口测试串口通讯是将来系统调试的主要手段,所以完成串口测试对于后面的系统调试很重要。
如图所示,串口的收发两线接到PB7和PB6两个IO口上。
串口配置:
实测结果:
前述两个测试都是采用串口展示的结果,说明串口通讯已经实际起到作用。
串口使用过程中遇到的问题总结:
STM32CubeMx生成的串口驱动代码中,对于收发引脚的初始化如下:
- /**
- *@Brief USART1 Initialization Function
- *@param None
- *@retval None
- */
- static void MX_USART1_UART_Init(void)
- {
- /*USER CODE BEGIN USART1_Init 0 */
- /*USER CODE END USART1_Init 0 */
- LL_USART_InitTypeDef USART_InitStruct = {0};
- LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
- /*Peripheral clock enable */
- LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1);
- LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
- /**USART1 GPIO Configuration
- PB6 ------> USART1_TX
- PB7 ------> USART1_RX
- */
- GPIO_InitStruct.Pin = UART_TX_Pin;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
- GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
- LL_GPIO_Init(UART_TX_GPIO_Port,&GPIO_InitStruct);
- GPIO_InitStruct.Pin = UART_RX_Pin;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
- GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
- LL_GPIO_Init(UART_RX_GPIO_Port, &GPIO_InitStruct);
- /*USER CODE BEGIN USART1_Init 1 */
- /*USER CODE END USART1_Init 1 */
- USART_InitStruct.BaudRate = 9600;
- USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
- USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
- USART_InitStruct.Parity = LL_USART_PARITY_NONE;
- USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
- USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
- USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
- LL_USART_Init(USART1, &USART_InitStruct);
- LL_USART_DisableIT_CTS(USART1);
- LL_USART_ConfigAsyncMode(USART1);
- LL_USART_Enable(USART1);
- /*USER CODE BEGIN USART1_Init 2 */
- /*USER CODE END USART1_Init 2 */
- }
实际的使用过程中会发现,发送数据是正常的,但是接收数据不正确,表现为可以正确的产生接收中断,但是接收到的数据全是0,经过仔细的检查硬件回路,没有出现接收引脚虚焊、短路的现象,排除了硬件故障的影响,也就是说问题还是出在软件设计上,最终发现,接收引脚的配置中,只要将引脚上拉打开,一切问题都解决了。
- GPIO_InitStruct.Pin = UART_RX_Pin;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
- GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
- LL_GPIO_Init(UART_RX_GPIO_Port, &GPIO_InitStruct);
以后在f0的设计使用上要注意这一点。