[AT32F421]

AT32F421 PA2的PWM信号影响比较器输出信号

[复制链接]
758|5
手机看帖
扫描二维码
随时随地手机跟帖
13424429401|  楼主 | 2024-11-22 12:40 | 显示全部楼层 |阅读模式
在开发无感电调过程中,使用比较器检测电机转速,在使能比较器后,输出信号会被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);


}

使用特权

评论回复
13424429401|  楼主 | 2024-11-22 12:42 | 显示全部楼层
3532667400ba6bde85.png
3553567400b7b58974.png

使用特权

评论回复
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是输出的还是输入的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝