AT32F421 PA2的PWM信号影响比较器输出信号
在开发无感电调过程中,使用比较器检测电机转速,在使能比较器后,输出信号会被PA2管脚PWM信号干扰,同样的硬件部分单板出现,部分单板不出现。使用买的两块F421的核心开发板,一块存在这个问题,另一块不存在,请问是什么原因导致?有什么解决方案?验证代码如下:
#include "at32f421.h"
#include "string.h"
#include "stdio.h"
//过零点输出
#define COMP_OUT_GPIO_PORT GPIOA
#define COMP_OUT_GPIO_PIN GPIO_PINS_11
#define COMP_OUT_GPIO_PIN_SOURCE GPIO_PINS_SOURCE11
#define COMP_OUT_GPIO_MUX GPIO_MUX_7
//比较器管脚
#define PHASE_A_COMP_PIN GPIO_PINS_0
#define PHASE_B_COMP_PIN GPIO_PINS_4
#define PHASE_C_COMP_PIN GPIO_PINS_5
#define PHASE_COM_COMP_PINGPIO_PINS_1
#define COMP_GPIO_PORT GPIOA
#define COMP_GPIO_CLOCK CRM_GPIOA_PERIPH_CLOCK
#define COMP_PA0 0xE5//
#define COMP_PA4 0xC1//
#define COMP_PA5 0xD1//
//相位管脚配置
#define PHASE_C_GPIO_LOW GPIO_PINS_1
#define PHASE_C_GPIO_PORT_LOW GPIOB
#define PHASE_C_GPIO_HIGH GPIO_PINS_10
#define PHASE_C_GPIO_PORT_HIGHGPIOA
#define PHASE_B_GPIO_LOW GPIO_PINS_0
#define PHASE_B_GPIO_PORT_LOW GPIOB
#define PHASE_B_GPIO_HIGH GPIO_PINS_9
#define PHASE_B_GPIO_PORT_HIGHGPIOA
#define PHASE_A_GPIO_LOW GPIO_PINS_7
#define PHASE_A_GPIO_PORT_LOW GPIOA
#define PHASE_A_GPIO_HIGH GPIO_PINS_8
#define PHASE_A_GPIO_PORT_HIGHGPIOA
#define PHASE_A_COMP COMP_PA0 //比较器管脚配置
#define PHASE_B_COMP COMP_PA4 //比较器管脚配置
#define PHASE_C_COMP COMP_PA5 //比较器管脚配置
void COMPOutInit()
{
gpio_init_type gpio_init_struct;
/* enable the gpioa clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
//PA11作为比较器输出
gpio_init_struct.gpio_pins = COMP_OUT_GPIO_PIN;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(COMP_OUT_GPIO_PORT, &gpio_init_struct);
gpio_pin_mux_config(COMP_OUT_GPIO_PORT, COMP_OUT_GPIO_PIN_SOURCE, COMP_OUT_GPIO_MUX);
}
void COMPInit(void) //比较器初始化,这里没有启用中断
{
gpio_init_type gpio_init_struct;
/* gpioa peripheral clock enable */
crm_periph_clock_enable(COMP_GPIO_CLOCK, TRUE);
gpio_init_struct.gpio_pins = PHASE_A_COMP_PIN|PHASE_B_COMP_PIN|PHASE_C_COMP_PIN|PHASE_COM_COMP_PIN;
gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(COMP_GPIO_PORT, &gpio_init_struct);
cmp_init_type cmp_init_struct;
/* cmp peripheral clock enable */
crm_periph_clock_enable(CRM_CMP_PERIPH_CLOCK, TRUE);
/* cmp1 init: pa1 is used cmp1 inverting input */
cmp_default_para_init(&cmp_init_struct);
cmp_init_struct.cmp_inverting = CMP_INVERTING_1_4VREFINT;
cmp_init_struct.cmp_output = CMP_OUTPUT_NONE;
cmp_init_struct.cmp_polarity = CMP_POL_NON_INVERTING;
cmp_init_struct.cmp_speed = CMP_SPEED_MEDIUM;
cmp_init_struct.cmp_hysteresis = CMP_HYSTERESIS_NONE;
cmp_init(CMP1_SELECTION, &cmp_init_struct);
cmp_enable(CMP1_SELECTION, TRUE);
NVIC_SetPriority(ADC1_CMP_IRQn, 2);
NVIC_EnableIRQ(ADC1_CMP_IRQn);
}
int main(void)
{
COMPOutInit();
COMPInit();
CMP->ctrlsts=PHASE_A_COMP;
while(1);
}
“一块存在这个问题,另一块不存在”
是不是要对比一下两块板子的区别? 确认了两个硬件没有差异,两块核心开发板都存在同样的问题,另一块开发板上电几秒后也出现了。 可能是硬件设计或制造差异导致。解决方案包括优化 PCB 布局、增加屏蔽、检查信号完整性和一致性。 PA2管脚的PWM是输出的还是输入的 PA2的是输入信号。这个问题代理商找了工程师一起分析了。刚开始也怀疑是硬件设计问题,后来把代码移植到代理商的开发板上也概率复现了这个问题。对于这个问题可能和单片机个体一致性有关系,有的单片机很容易出现,有的单片机基本不出现。最终通过修改比较器的迟滞量把这个问题规避了。把CMPHYST修改为11:高度迟滞 。这样修改不影响到比较器的转速检测,算是规避解决了。
页:
[1]