打印
[技术问答]

针对HC32L110的使用ADC进行电压数据采集,uart数据收发异常

[复制链接]
1208|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Garys|  楼主 | 2023-6-5 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, ADC, HC, UART, dc
就是使用这个hc32l110的ADC模块来进行电压数据采集,然后把数据通过uart在串口上打印。但是不知道为什么我写的代码在获取电压数据,打印出来一直为0,电路是没什么问题的。
#include "ddl.h"
#include "uart.h"
#include "bt.h"
#include "lpm.h"
#include "gpio.h"
#include "adc.h"



#define     T1_PORT                 (3)
#define     T1_PIN                  (3)


static  uint16_t u16ScanResult[8];
uint8_t u8Rx**=0;
uint8_t Check**=0;
uint8_t u8RxData[3]={0x11,0x22,0X33};

void AdcContIrqCallback(void)
{   
    Adc_GetScanResult(0,&u16ScanResult[0]);

    M0P_ADC->CR0_f.STATERST = 1u;  

    M0P_BT1->ICLR_f.TFC = 0;
}

void RxIntCallback(void)
{
                u8RxData[2]=M0P_UART1->SBUF;
          u8Rx** = 1;
}



void ErrIntCallback(void)
{

}

void AdcRegIrqCallback(void)
{   

}

void AdcHhtIrqCallback(void)
{   

}

void AdcLltIrqCallback(void)
{   

}

int32_t main(void)
{  
       
           uint16_t timer=0;
    uint32_t pclk=0;
          uint16_t                  u16ArrData2;
    uint16_t                  u16InitCntData2;
                stc_adc_cfg_t             stcAdcCfg                                ;
    stc_adc_scan_cfg_t        stcAdcScanCfg                ;
    stc_adc_irq_t             stcAdcIrq                                ;
    stc_adc_irq_calbakfn_pt_t stcAdcIrqCalbaks;
    stc_bt_config_t           stcBtConfig                        ;
                stc_uart_config_t                           stcConfig                                ;       
    stc_uart_irq_cb_t                                 stcUartIrqCb                ;
    stc_uart_multimode_t                         stcMulti                                ;
    stc_uart_baud_config_t          stcBaud                                        ;
          


    DDL_ZERO_STRUCT(stcAdcCfg);
    DDL_ZERO_STRUCT(stcAdcScanCfg);
    DDL_ZERO_STRUCT(stcAdcIrq);
    DDL_ZERO_STRUCT(stcAdcIrqCalbaks);
       
          DDL_ZERO_STRUCT(stcUartIrqCb);
    DDL_ZERO_STRUCT(stcMulti);
    DDL_ZERO_STRUCT(stcBaud);
    DDL_ZERO_STRUCT(stcBtConfig);
       
    Clk_SwitchTo(ClkRCL);
    Clk_SetRCHFreq(ClkFreq24Mhz);
    Clk_SwitchTo(ClkRCH);            


    Gpio_SetAnalog(2, 4, TRUE);
               
                Adc_Enable();
    M0P_BGR->CR_f.BGR_EN = 0x1u;   
    M0P_BGR->CR_f.TS_EN = 0x0u;   
    delay100us(1);

    stcAdcCfg.enAdcOpMode                             = AdcScanMode;              
    stcAdcCfg.enAdcClkSel                             = AdcClkSysTDiv1;           
    stcAdcCfg.enAdcSampTimeSel            = AdcSampTime8Clk;     
    stcAdcCfg.enAdcRefVolSel                    = RefVolSelAVDD;         
    stcAdcCfg.bAdcInBufEn                             = FALSE;                    
    stcAdcCfg.enAdcTrig0Sel                     = AdcTrigTimer2;         
    stcAdcCfg.enAdcTrig1Sel                     = AdcTrigDisable;
    Adc_Init(&stcAdcCfg);           
                                                                                                                                    
    stcAdcIrq.bAdcIrq               = TRUE;                           
    stcAdcIrq.bAdcRegCmp            = FALSE;
    stcAdcIrq.bAdcHhtCmp            = FALSE;
    stcAdcIrq.bAdcLltCmp            = FALSE;
    stcAdcIrqCalbaks.pfnAdcContIrq  = AdcContIrqCallback;
    stcAdcIrqCalbaks.pfnAdcRegIrq   = AdcRegIrqCallback;
    stcAdcIrqCalbaks.pfnAdcHhtIrq   = AdcHhtIrqCallback;
    stcAdcIrqCalbaks.pfnAdcLltIrq   = AdcLltIrqCallback;
    Adc_ConfigIrq(&stcAdcIrq, &stcAdcIrqCalbaks);      
    Adc_EnableIrq();                                    
    Adc_CmpCfg(&stcAdcIrq);                             

    stcAdcScanCfg.u8AdcScanModeCh         =  ADC_SCAN_CH1_EN;
               
                stcAdcScanCfg.u8AdcSampCnt = 0x1;                  
    Adc_ConfigScanMode(&stcAdcCfg, &stcAdcScanCfg);

    Gpio_InitIO(T1_PORT,T1_PIN,GpioDirIn);
    Gpio_InitIO(0,3,GpioDirOut);
    Gpio_SetIO(0,3,1);

    Gpio_InitIOExt(3,5,GpioDirOut,TRUE,FALSE,FALSE,FALSE);   
    Gpio_InitIOExt(3,6,GpioDirOut,TRUE,FALSE,FALSE,FALSE);


    Gpio_SetFunc_UART1TX_P35();
    Gpio_SetFunc_UART1RX_P36();
               
                Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);
    Clk_SetPeripheralGate(ClkPeripheralUart1,TRUE);
                if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdcBgr, TRUE))
    {
        return Error;
    }

    stcUartIrqCb.pfnRxIrqCb        = RxIntCallback;
    stcUartIrqCb.pfnTxIrqCb        = NULL;
    stcUartIrqCb.pfnRxErrIrqCb     = ErrIntCallback;
    stcConfig.pstcIrqCb                                           = &stcUartIrqCb;
    stcConfig.bTouchNvic                                          = TRUE;


    stcConfig.enRunMode = UartMode3;


    stcMulti.enMulti_mode = UartNormal;

    stcConfig.pstcMultiMode = &stcMulti;

    stcBaud.bDbaud = 0u;
    stcBaud.u32Baud = 2400U;
    stcBaud.u8Mode = UartMode3;
    pclk = Clk_GetPClkFreq();
    timer=Uart_SetBaudRate(UARTCH1,pclk,&stcBaud);

    stcBtConfig.enMD    = BtMode2;
                stcBtConfig.enCT    = BtTimer;
          Bt_ClearIntFlag(TIM1);
          Bt_EnableIrq(TIM1);

    Bt_Init(TIM1, &stcBtConfig);
    Bt_ARRSet(TIM1,timer);
    Bt_Cnt16Set(TIM1,timer);

    Uart_Init(UARTCH1, &stcConfig);
    Uart_EnableIrq(UARTCH1,UartRxIrq);
    Uart_ClrStatus(UARTCH1,UartRxFull);
    Uart_EnableFunc(UARTCH1,UartRx);
               
                stcBtConfig.enGateP = BtPositive;
    stcBtConfig.enGate  = BtGateDisable;   
    stcBtConfig.enPRS   = BtPCLKDiv256;   
    stcBtConfig.enTog   = BtTogDisable;   
    stcBtConfig.enCT    = BtTimer;
    stcBtConfig.enMD    = BtMode2;

    Bt_Init(TIM2, &stcBtConfig);

    Bt_ClearIntFlag(TIM2);
    Bt_EnableIrq(TIM2);

    u16ArrData2 = 0x10000 - 9375;      
    u16InitCntData2 = 0x10000 - 9375;
    Bt_ARRSet(TIM2, u16ArrData2);
    Bt_Cnt16Set(TIM2, u16InitCntData2);
    Bt_Run(TIM2);
                Bt_Run(TIM1);
       
    while(1)
        {
                Adc_Start();
          Check** = 0;
                u8RxData[1] = (u16ScanResult[1] >> 8 );
                u8RxData[0] = (u16ScanResult[1] & 0xFF);
                if(u8Rx**)
                {
                        u8Rx** = 0;
                       
                        if(Uart_CheckEvenOrOdd(UARTCH1,Even,u8RxData[2])!=Ok)
                        {
                                Check** = 1;
                        }
                        else
                        {
                               
                                Uart_SetTb8(UARTCH1,Even,u8RxData[0]);
                          Uart_SendData(UARTCH1,u8RxData[0]);                               
                          Uart_SetTb8(UARTCH1,Even,u8RxData[1]);
                          Uart_SendData(UARTCH1,u8RxData[1]);
                                Uart_SetTb8(UARTCH1,Even,u8RxData[2]);
                          Uart_SendData(UARTCH1,u8RxData[2]);
                        }
                }
        }

}


使用特权

评论回复
沙发
liuyuxiier| | 2023-6-5 16:21 | 只看该作者
代码太长啦,建议把问题分割一下,缩小一下问题范围,所谓授人以鱼不如授人以渔,
你这里涉及两个主要功能,一个是ADC采集,一个是串口发送。
先排查ADC是否能正常采集到电压。使用仿真器,观察ADC结果寄存器有没有数据。
如果ADC结果寄存器没有数据,那就检查ADC的配置,比如端口配置,ADC时钟,ADC通道配置,模式配置,触发配置等等。
如果ADC结果寄存器有数据,那就检查USART配置,可以先给一组固定的数据看看能够正常打印。
如果能正常打印,就重点检查ADC结果寄存器的读取与数据转换。

以上步骤可以把问题缩小到一定的范围,你再精准的把问题提出来,大家也会有针对性的帮你解决问题了。祝好运。

使用特权

评论回复
评论
Garys 2023-6-6 16:27 回复TA
成功了!弄出来了谢谢指导 
Garys 2023-6-6 13:02 回复TA
@liuyuxiier :我有个疑问 Adc_GetScanResult(0, &u16ScanResult[0]);这个是获取数据,那我给uart的数据赋值是u16ScanResult[0]还是Adc_GetScanResult 
liuyuxiier 2023-6-5 16:36 回复TA
@Garys :我看你代码里,ADC是TIMER2触发的 
Garys 2023-6-5 16:28 回复TA
好的,谢谢你的指导,我先去试试看,看能不能成功。串口方面我检查没什么问题,不知道是不是adc和uart公用一个tim1的缘故,导致采样周期问题 
板凳
wubangmi| | 2023-6-6 09:32 | 只看该作者
u8RxData[1] = (u16ScanResult[1] >> 8 );
u8RxData[0] = (u16ScanResult[1] & 0xFF);
你认真考虑下上面这两条语句放在while死循环里直接运行会产生什么效果?
可能几个微秒就执行一次。u8RxData[]这个数组极大部分时间都是等于0.

使用特权

评论回复
评论
Garys 2023-6-6 16:27 回复TA
成功了,弄出来了 
Garys 2023-6-6 16:07 回复TA
我把这个调整到外面还是为0,想了几个办法进行改变,但是不知道为什么数据一直没有,都是0 
地板
xch| | 2023-6-6 11:07 | 只看该作者
ADC 和 UART 得分开测试。要不然都是临时工的责任。

使用特权

评论回复
评论
Garys 2023-6-6 16:26 回复TA
成功了!谢谢你 
Garys 2023-6-6 16:05 回复TA
还是不行,一直为0,我感觉有可能数据没采出来 
Garys 2023-6-6 13:04 回复TA
好的,谢谢你的指导,我去试试 
5
xch| | 2023-6-6 16:21 | 只看该作者
本帖最后由 xch 于 2023-6-6 16:29 编辑

ADC 模拟信号输入引脚是哪个?

对应的初始化代码是哪段?
P24?


使用特权

评论回复
评论
Garys 2023-6-6 16:26 回复TA
刚刚弄出来了,我把问题复杂化了 
6
wubangmi| | 2023-6-6 17:08 | 只看该作者
本帖最后由 wubangmi 于 2023-6-6 17:18 编辑

楼主这个整合能力还有待提高,还要多研究相对应的用户手册。

使用特权

评论回复
评论
Garys 2023-6-7 10:28 回复TA
是的,刚接触这个芯片还不太熟悉 
7
tpgf| | 2023-7-6 11:56 | 只看该作者
能在程序里边看到采集到的数据是不是正确的呢

使用特权

评论回复
8
paotangsan| | 2023-7-6 13:13 | 只看该作者
能确定一下就是获取的电压数据是不是正确的呢

使用特权

评论回复
9
wakayi| | 2023-7-6 13:53 | 只看该作者
不用ad采集的话  直接让串口发送固定数据 观察一下现象

使用特权

评论回复
10
heimaojingzhang| | 2023-7-6 18:59 | 只看该作者
楼主看一下发送数据缓冲里边的数据是什么

使用特权

评论回复
11
keaibukelian| | 2023-7-6 19:29 | 只看该作者
用示波器看一下实际发送的数据是不是正确

使用特权

评论回复
12
renzheshengui| | 2023-7-6 19:56 | 只看该作者
楼主可以先不发送 看一下采集的数据是不是正确的

使用特权

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

本版积分规则

1

主题

11

帖子

0

粉丝