打印
[N32G03x]

N32G032C8L7有一定概率AD采集口损坏

[复制链接]
867|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
N32G032C8L7的AD采集口会出现一直输出5V或端口电压值变动而AD值不变的情况,重新上电无法解决,只有更换芯片。现在使用的是PA4端口。

使用特权

评论回复
沙发
zhaolei2612|  楼主 | 2022-8-26 17:07 | 只看该作者
AD采集电路。只是在公司测试,J16接的变阻箱,首次上电就读不到AD值。手工焊接的芯片,重新焊接也不行,只有更换芯片。目前测试了三四十个,有2个有问题,一个一直输出5V,一个端口电压改变而AD值不变。

使用特权

评论回复
板凳
zhaolei2612|  楼主 | 2022-8-26 17:08 | 只看该作者
本帖最后由 zhaolei2612 于 2022-8-26 17:10 编辑


123.png (25.48 KB )

123.png

使用特权

评论回复
地板
zhaolei2612|  楼主 | 2022-8-26 17:13 | 只看该作者
#define AD_FUEL_PORT   (GPIOA)
#define AD_FUEL_PIN    (GPIO_PIN_4)
        RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA, ENABLE);
        RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC, ENABLE);
        RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSE, RCC_ADC1MCLK_DIV12);
        ADC_ConfigClk(ADC_CTRL3_CKMOD_AHB, RCC_ADCHCLK_DIV16);
MY_GPIO_Init(AD_FUEL_PORT,AD_FUEL_PIN,GPIO_MODE_ANALOG,GPIO_NO_PULL,GPIO_SPEED_LOW,GPIO_DC_LOW,GPIO_NO_AF);
void MYADC_Init(void)
{
        ADC_InitType ADC_InitStructure;
        DMA_InitType DMA_InitStructure;
       
        /* DMA channel1 configuration ----------------------------------------------*/
        DMA_DeInit(DMA_CH1);
        DMA_StructInit(&DMA_InitStructure);
        DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC->DAT;
        DMA_InitStructure.MemAddr        = (uint32_t)&ADCConvertedValue[0];
        DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
        DMA_InitStructure.BufSize        = 2;
        DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
        DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
        DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;
        DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
        DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
        DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
        DMA_Init(DMA_CH1, &DMA_InitStructure);
        DMA_RequestRemap(DMA_REMAP_ADC, DMA, DMA_CH1, ENABLE);

        /* Enable DMA channel1 */
        DMA_EnableChannel(DMA_CH1, ENABLE);

        /* ADC configuration ------------------------------------------------------*/
        ADC_InitStruct(&ADC_InitStructure);
        ADC_InitStructure.MultiChEn      = ENABLE;
        ADC_InitStructure.ContinueConvEn = DISABLE;
        ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIGCONV_NONE;
        ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
        ADC_InitStructure.ChsNumber      = 2;
        ADC_Init(ADC, &ADC_InitStructure);
        /* ADC regular channel1 configuration */
        ADC_ConfigRegularChannel(ADC, ADC_CH_4_PA4, 1, ADC_SAMP_TIME_56CYCLES5);
        ADC_ConfigRegularChannel(ADC, ADC_CH_5_PA5, 2, ADC_SAMP_TIME_56CYCLES5);
        /* Enable ADC DMA */
        ADC_EnableDMA(ADC, ENABLE);

        /* Enable ADC */
        ADC_Enable(ADC, ENABLE);

        /*wait ADC is ready to use*/
        while(!ADC_GetFlagStatusNew(ADC, ADC_FLAG_RDY))
        ;
        /*wait ADC is powered on*/
        while(ADC_GetFlagStatusNew(ADC, ADC_FLAG_PD_RDY))
        ;
        /* Start ADC Software Conversion */
        ADC_EnableSoftwareStartConv(ADC, ENABLE);       
}

void MYADC_Run(void)
{
        uint32_t loop = 0;
        uint32_t loopb = 0;
        uint32_t dat0=0,dat1=0;

        ADC_EnableSoftwareStartConv(ADC, ENABLE);       
        while(!ADC_GetFlagStatus(ADC, ADC_FLAG_ENDC));
        ADC_ClearFlag(ADC,ADC_FLAG_ENDC);
       
        dat0=ADCConvertedValue[0];
        dat1=ADCConvertedValue[1];
       
        loop = dat0;//油量
        if(loop>TABLE_FUEL[0])
                loop = TABLE_FUEL[0];
        if(loop<TABLE_FUEL[8])
                loop = TABLE_FUEL[8];
        ucBufFuel[ucLocFuel]=loop;
        ucLocFuel++;
        ucCntFuel++;
        if(ucLocFuel>=5)
                ucLocFuel=0;
        if(ucCntFuel>=5)
                ucCntFuel=5;
        loop=0;
        for(loopb=0;loopb<ucCntFuel;loopb++)
                loop+=ucBufFuel[loopb];
        loop/=ucCntFuel; //????
        loopb=0;
        while(loop<TABLE_FUEL[loopb])
                loopb++;
        if(0==loopb)
                loop = 0;
        else
                loop = 125*loopb-(loop-TABLE_FUEL[loopb])*125/(TABLE_FUEL[loopb-1]-TABLE_FUEL[loopb]);
        loop/=10;
        Adc_Fuel=loop;//0~100
       
        loop = dat1;//电压
        ucBufBV[ucLocBV] = loop;
        ucLocBV++;
        ucCntBV++;
        if(ucLocBV>=4)
                ucLocBV = 0;
        if(ucCntBV>=4)
                ucCntBV = 4;
        loop=0;
        for(loopb=0;loopb<ucCntBV;loopb++)
                loop += ucBufBV[loopb];
        loop /= ucCntBV; //
        loop = loop*25/149+12;
        Adc_Bv=loop;
}


使用特权

评论回复
5
画个朴昧| | 2022-8-29 19:28 | 只看该作者
zhaolei2612 发表于 2022-8-26 17:07
AD采集电路。只是在公司测试,J16接的变阻箱,首次上电就读不到AD值。手工焊接的芯片,重新焊接也不行,只 ...

有测试过I/O的电气特性吗?

使用特权

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

本版积分规则

10

主题

97

帖子

0

粉丝