打印

华大HC32L130 485接收影响AD稳定

[复制链接]
10952|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
流浪的屁屁|  楼主 | 2021-6-29 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HC, AD, dc, ADC, TI

问题现象: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)
******************************************************************************/


使用特权

评论回复
沙发
cyclefly| | 2021-7-3 11:36 | 只看该作者
一般不会有影响的,
而且485的选择引脚, 说白了,只是一个IO电平。
想不到原因在哪里

使用特权

评论回复
板凳
ZYQFBW| | 2021-7-3 15:58 | 只看该作者
电源波动

使用特权

评论回复
地板
daichaodai| | 2021-7-3 18:51 | 只看该作者
485发送数据的时候有没有影响?

使用特权

评论回复
5
zheng79| | 2021-7-4 10:47 | 只看该作者
485是5V供电的吧,输出给单片机的是5V信号,估计单片机那个脚是不可以输入5V电压的。

使用特权

评论回复
6
tail066| | 2021-7-15 13:56 | 只看该作者
楼主解决了么?
会是外部干扰么?

使用特权

评论回复
7
liangzhou1988| | 2021-7-15 14:07 | 只看该作者
检查485与华大L130的管脚连接,该连接管脚不能有高于MCU VCC的电平。否则会形成压差,影响MCU VCC的电源域导致ADC基准不稳定。这是MCU IO端口决定的,某些友商的IO端口不是这种结构确实不会有这种问题,无所谓优劣。@流浪的屁屁

使用特权

评论回复
8
wuha| | 2021-7-15 14:14 | 只看该作者
是不是485的电平高于单片机的电源了?华大单片机的IO输入电平最高不能超过VCC,否则直接影响ADC采样值。这个不如ST的好。ST的即使电源3.3V,但是很多引脚是兼容5V电平的。

使用特权

评论回复
9
流浪的屁屁|  楼主 | 2021-7-28 09:13 | 只看该作者
wuha 发表于 2021-7-15 14:14
是不是485的电平高于单片机的电源了?华大单片机的IO输入电平最高不能超过VCC,否则直接影响ADC采样值。这 ...

正如你所说,问题已解决,原因是HC的IO口最大电压只有VCC+0.3,而485是5V供电的

使用特权

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

本版积分规则

10

主题

29

帖子

0

粉丝