13424429401 发表于 2024-11-22 12:40

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);


}

13424429401 发表于 2024-11-22 12:42

muyichuan2012 发表于 2024-11-22 12:55

“一块存在这个问题,另一块不存在”
是不是要对比一下两块板子的区别?

13424429401 发表于 2024-11-22 16:01

确认了两个硬件没有差异,两块核心开发板都存在同样的问题,另一块开发板上电几秒后也出现了。

丙丁先生 发表于 2024-11-23 08:21

可能是硬件设计或制造差异导致。解决方案包括优化 PCB 布局、增加屏蔽、检查信号完整性和一致性。

药无尘 发表于 2024-11-23 09:42

PA2管脚的PWM是输出的还是输入的

13424429401 发表于 2024-12-23 21:14

PA2的是输入信号。这个问题代理商找了工程师一起分析了。刚开始也怀疑是硬件设计问题,后来把代码移植到代理商的开发板上也概率复现了这个问题。对于这个问题可能和单片机个体一致性有关系,有的单片机很容易出现,有的单片机基本不出现。最终通过修改比较器的迟滞量把这个问题规避了。把CMPHYST修改为11:高度迟滞 。这样修改不影响到比较器的转速检测,算是规避解决了。
页: [1]
查看完整版本: AT32F421 PA2的PWM信号影响比较器输出信号