问答

汇集网友智慧,解决技术难题

21ic问答首页 - 华大HC32L130 485接收影响AD稳定

HC AD dc ADC TI

华大HC32L130 485接收影响AD稳定


问题现象:AD值会波动,波动值在0~80左右,具体如下,请教大佬有遇到过吗?

尝试分析测试试验(采用官方库例程,配置串口跟AD部分):

1.485EN脚配置为高电平,AD就稳定,再次配置成低电平,AD波动;
2.485EN脚配置到PC13或PD7,初始化配置输出低电平,AD波动;
3.485EN脚加硬件光耦隔离电路,仍旧配置输出低电平,AD波动;
4.485EN脚悬空,AD稳定;
5.485EN脚配置输出低电平,485上位机不接,AD稳定;
6.将串口(PA2/PA3)改为配置到串口0(PA9/PA10),PA2/PA3默认不配置,AD波动,PA2/PA3配置成输出,AD稳定;
7.尝试将AD优先级配置1,串口优先级默认3,AD也还是波动;

综上,初步判定是485接收导致AD波动,与优先级无关,但是,该测试板是在原先ST板上换上华大芯片改的,ST量产的没发现这个问题。


/*****************************************************************************/
/** \file main.c
**
** A detailed description is available at
** @link Sample Group Some description @endlink
**
**   - 2017-05-28 LiuHL    First Version
**
******************************************************************************/

/******************************************************************************
* Include files
******************************************************************************/
#include "adc.h"
#include "gpio.h"
#include "bgr.h"
#include "uart.h"

/******************************************************************************
* Local pre-processor symbols/macros ('#define')                           
******************************************************************************/


/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
volatile uint32_t u32AdcRestult0;
volatile uint32_t u32AdcRestult0_1;
volatile uint32_t u32AdcRestult2;
volatile uint32_t u32AdcRestult5;
/******************************************************************************
* Local type definitions ('typedef')                                         
******************************************************************************/
volatile static uint8_t u8RxData;
volatile static uint8_t u8TxCnt=0;
volatile static uint8_t u8RxCnt=0;

/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/

/******************************************************************************
* Local variable definitions ('static')                                      *
******************************************************************************/

/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
void App_AdcPortInit(void);
void App_AdcInit(void);
void App_AdcJqrCfg(void);
void App_UartCfg(void);
void App_PortInit(void);

/**
******************************************************************************
** \brief  Main function of project
**
** \return uint32_t return value, if needed
**
** This sample
**
******************************************************************************/
int32_t main(void)
{      
      //串口引脚配置
    App_PortInit();

    //串口配置
    App_UartCfg();

    ///< ADC 采样端口初始化
    App_AdcPortInit();   

    ///< ADC模块初始化
    App_AdcInit();

    ///< ADC插队扫描功能配置
    App_AdcJqrCfg();

    while(1)
    {   
        delay1ms(100);
          Adc_JQR_Start();
        ;
    }
}

///< ADC中断服务函数
void Adc_IRQHandler(void)
{   
    if(TRUE == Adc_GetIrqStatus(AdcMskIrqJqr))
    {
        Adc_ClrIrqStatus(AdcMskIrqJqr);

        u32AdcRestult0   = Adc_GetJqrResult(AdcJQRCH0MUX);
        u32AdcRestult2   = Adc_GetJqrResult(AdcJQRCH1MUX);
        u32AdcRestult5   = Adc_GetJqrResult(AdcJQRCH2MUX);
        u32AdcRestult0_1 = Adc_GetJqrResult(AdcJQRCH3MUX);

        Adc_JQR_Stop();
    }
}

///< ADC采样端口初始化
void App_AdcPortInit(void)
{   
    ///< 开启ADC/BGR GPIO外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);

    Gpio_SetAnalogMode(GpioPortA, GpioPin7);        //PA00 (AIN0)
    Gpio_SetAnalogMode(GpioPortB, GpioPin0);        //PA02 (AIN2)
    Gpio_SetAnalogMode(GpioPortB, GpioPin1);        //PA05 (AIN5)
}

///< ADC模块初始化
void App_AdcInit(void)
{
    stc_adc_cfg_t              stcAdcCfg;

    DDL_ZERO_STRUCT(stcAdcCfg);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
    Bgr_BgrEnable();        ///< 开启BGR
    ///< ADC 初始化配置
    stcAdcCfg.enAdcMode         = AdcScanMode;              ///<采样模式-扫描
    stcAdcCfg.enAdcClkDiv       = AdcMskClkDiv8;            ///<采样分频-1
    stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk;      ///<采样周期数-8
    stcAdcCfg.enAdcRefVolSel    = AdcMskRefVolSelAVDD;      ///<参考电压选择-VCC
    stcAdcCfg.enAdcOpBuf        = AdcMskBufDisable;         ///<OP BUF配置-关
    stcAdcCfg.enInRef           = AdcMskInRefDisable;       ///<内部参考电压使能-关
    stcAdcCfg.enAdcAlign        = AdcAlignRight;               ///<转换结果对齐方式-右
    Adc_Init(&stcAdcCfg);
}
///< ADC插队扫描功能配置
void App_AdcJqrCfg(void)
{
    stc_adc_jqr_cfg_t          stcAdcJqrCfg;

    DDL_ZERO_STRUCT(stcAdcJqrCfg);

    ///< 插队扫描模式功能及通道配置
    ///< 注意:扫描模式下,当配置转换次数为n时,转换通道的配置范围必须为[JQRCH(0)MUX,JQRCH(n-1)MUX]
    stcAdcJqrCfg.bJqrDmaTrig = FALSE;
    stcAdcJqrCfg.u8JqrCnt    = 4;
    Adc_JqrModeCfg(&stcAdcJqrCfg);

    Adc_CfgJqrChannel(AdcJQRCH0MUX, AdcExInputCH7);
    Adc_CfgJqrChannel(AdcJQRCH1MUX, AdcExInputCH8);
    Adc_CfgJqrChannel(AdcJQRCH2MUX, AdcExInputCH9);
    Adc_CfgJqrChannel(AdcJQRCH3MUX, AdcExInputCH7);

    ///< ADC 中断使能
    Adc_EnableIrq();
    EnableNvic(ADC_IRQn, IrqLevel1, TRUE);

    ///< 启动插队扫描采样
    Adc_JQR_Start();
}


//UART1中断函数
void Uart1_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART1, UartRC))         //UART1数据接收
    {
        Uart_ClrStatus(M0P_UART1, UartRC);        //清中断状态位
        u8RxData = Uart_ReceiveData(M0P_UART1);   //接收数据字节
        u8RxCnt++;
    }

    if(Uart_GetStatus(M0P_UART1, UartTC))         //UART1数据发送
    {
        Uart_ClrStatus(M0P_UART1, UartTC);        //清中断状态位
        u8TxCnt++;
    }

}

//串口引脚配置
void App_PortInit(void)
{
    stc_gpio_cfg_t stcGpioCfg;

    DDL_ZERO_STRUCT(stcGpioCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟

    ///<TX
   stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin2, GpioAf1);          //配置PA02 端口为URART1_TX

    ///<RX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA, GpioPin3, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin3, GpioAf1);          //配置PA03 端口为URART1_RX

        /// 485EN                 
                stcGpioCfg.enDir = GpioDirOut;
                stcGpioCfg.enPu = GpioPuDisable;
                stcGpioCfg.enPd = GpioPuDisable;  
               
          Gpio_Init(GpioPortA, GpioPin1, &stcGpioCfg);
            Gpio_ClrIO(GpioPortA, GpioPin1);

            //Gpio_SetIO(GpioPortA, GpioPin1);
}

//串口配置
void App_UartCfg(void)
{
    stc_uart_cfg_t    stcCfg;

    DDL_ZERO_STRUCT(stcCfg);

    ///< 开启外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟

    ///<UART Init
    stcCfg.enRunMode        = UartMskMode3;          ///<模式3
    stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
    stcCfg.enMmdorCk        = UartMskEven;           ///<偶检验
    stcCfg.stcBaud.u32Baud  = 9600;                  ///<波特率9600
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;       ///<通道采样分频配置
    stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
    Uart_Init(M0P_UART1, &stcCfg);                   ///<串口初始化

    ///<UART中断使能
    Uart_ClrStatus(M0P_UART1,UartRC);                ///<清接收请求
    Uart_ClrStatus(M0P_UART1,UartTC);                ///<清接收请求
    Uart_EnableIrq(M0P_UART1,UartRxIrq);             ///<使能串口接收中断
    Uart_EnableIrq(M0P_UART1,UartTxIrq);             ///<使能串口接收中断
    EnableNvic(UART1_IRQn, IrqLevel3, TRUE);       ///<系统中断使能

}

/******************************************************************************
* EOF (not truncated)
******************************************************************************/


回答 +关注 15
11266人浏览 8人回答问题 分享 举报
8 个回答

您需要登录后才可以回复 登录 | 注册