在开发无感电调过程中,使用比较器检测电机转速,在使能比较器后,输出信号会被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_PIN GPIO_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_HIGH GPIOA
#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_HIGH GPIOA
#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_HIGH GPIOA
#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);
}
|