5108|7

1532

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【国民技术N32G457评测】ADC数据采集 [复制链接]

  本帖最后由 jinglixixi 于 2022-1-30 18:32 编辑

由资料可知,在N32G457的片内有4个12bit 5Msps 高速 ADC, 并可配置为 12/10/8/6bit 模式来使用。此外,它有多达 40 路外部单端输入通道,并支持差分输入模式。

单端输入通道。

以采样ADC1的模拟电压为例,可由引脚PC0和 PC1 来提供检测范围内的模拟信号。

进行数据采集的主程序为:

int main(void)
{
    RCC_Configuration();
    GPIO_Configuration();
    ADC_Initial(ADC1);
    USART1_Config();
    while(1)
    {
        ADC1ConvertedValue[0]=ADC_GetData(ADC1,ADC1_Channel_06_PC0);
        ADC1ConvertedValue[1]=ADC_GetData(ADC1,ADC1_Channel_07_PC1);
        printf("\r\n ADC1ConvertedValue = %d \r\n",ADC1ConvertedValue[0]);
        printf("\r\n ADC1ConvertedValue = %d \r\n",ADC1ConvertedValue[1]);
        Delay(1000000000);
    }
}

相应的通道采集函数为:

uint16_t ADC_GetData(ADC_Module* ADCx, uint8_t ADC_Channel)
{
    uint16_t dat;
    ADC_ConfigRegularChannel(ADCx, ADC_Channel, 1, ADC_SAMP_TIME_239CYCLES5);
    ADC_EnableSoftwareStartConv(ADCx, ENABLE);
    while(ADC_GetFlagStatus(ADCx, ADC_FLAG_ENDC)==0);
    ADC_ClearFlag(ADCx, ADC_FLAG_ENDC);
    ADC_ClearFlag(ADCx, ADC_FLAG_STR);
    dat=ADC_GetDat(ADCx);
    return dat;
}

经程序的编译与下载,其采集结果如图1所示:

图1  ADC数据采集

 

也就是说在PC0接3.3V电源,在 PC1接电源地时就可完成检测的目的,且能观察到检测的最大值和最小值。

以该程序为基础在配接相应模拟传感器的情况下,即可获得外部的状态变化,如使用火焰传感器来感知周围是否有火情发生,用土壤湿度传感器可检测绿植是否缺水等。

 

稍感意外的是在使用例程进行片内温度检测时,却发现其检测结果并非可信的问题,其程序为:

int main(void)
{
    RCC_Configuration();
    DMA_DeInit(DMA1_CH1);
    DMA_InitStructure.PeriphAddr     = (uint32_t)&ADC1->DAT;
    DMA_InitStructure.MemAddr        = (uint32_t)&ADCConvertedValue;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_SRC;
    DMA_InitStructure.BufSize        = 1;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_DISABLE;
    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(DMA1_CH1, &DMA_InitStructure);
    DMA_EnableChannel(DMA1_CH1, ENABLE);
    ADC_InitStructure.WorkMode       = ADC_WORKMODE_INDEPENDENT;
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = ENABLE;
    ADC_InitStructure.ExtTrigSelect  = ADC_EXT_TRIGCONV_NONE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_EnableTempSensorVrefint(ENABLE); 
    ADC_InitStructureEx.VbatMinitEn = ENABLE;
    ADC_InitStructureEx.DeepPowerModEn = DISABLE;
    ADC_InitStructureEx.JendcIntEn = DISABLE;
    ADC_InitStructureEx.EndcIntEn = DISABLE;
    ADC_InitStructureEx.ClkMode = ADC_CTRL3_CKMOD_AHB;
    ADC_InitStructureEx.CalAtuoLoadEn = DISABLE;
    ADC_InitStructureEx.DifModCal = false;
    ADC_InitStructureEx.ResBit = ADC_CTRL3_RES_12BIT;
    ADC_InitStructureEx.SampSecondStyle = false;
    ADC_InitEx(ADC1, &ADC_InitStructureEx);
    ADC_ConfigRegularChannel(ADC1, ADC_CH_16, 1, ADC_SAMP_TIME_239CYCLES5);
    ADC_EnableTempSensorVrefint(ENABLE); 
    ADC_EnableDMA(ADC1, ENABLE);
    ADC_Enable(ADC1, ENABLE);
    while(ADC_GetFlagStatusNew(ADC1,ADC_FLAG_RDY) == RESET) ;
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1)) ;
    ADC_EnableSoftwareStartConv(ADC1, ENABLE);
    USART1_Config();
    V30 = *(__IO uint32_t*)((uint32_t)0x1FFFF7D0);
    while (1)
    {
        TempValue = TempCal(ADCConvertedValue);
        printf("\r\n Temperature = %.3f C\r\n",TempValue);
        Delay(500);
    }
}

使用它进行检测的结果如图2所示,不知原因为何?

图2 片内温度检测

最新回复

楼主你看下我的贴子,也是ADC采集的,后来发现硬件问理 , 板子上硬件参考REF+,REF-默认是悬空的,你要连接到VCC和GND,   详情 回复 发表于 2022-2-10 08:51
点赞 关注
 
 

回复
举报

7048

帖子

11

TA的资源

版主

沙发
 
没有做温度传换呀!官方提供有个例程的,对照他的找一下问题,我测出来是正常的!公式为:vol = (float)value*3.3/4096;tempeter= (1.43-vol)/0.0043 + 25;

点评

好的,感谢!再看一看。  详情 回复 发表于 2022-1-31 10:51
 
 
 

回复

1532

帖子

1

TA的资源

五彩晶圆(初级)

板凳
 
lugl4313820 发表于 2022-1-31 08:34 没有做温度传换呀!官方提供有个例程的,对照他的找一下问题,我测出来是正常的!公式为:vol = (float)val ...

好的,感谢!再看一看。

点评

用的是这个: #define Vc0        0  #define Tc1        1.5f uint16_t  V30 = 0;  float TempCal(uint16_t TempAdVal) {     float T  详情 回复 发表于 2022-1-31 11:00
 
 
 

回复

1532

帖子

1

TA的资源

五彩晶圆(初级)

4
 
jinglixixi 发表于 2022-1-31 10:51 好的,感谢!再看一看。

用的是这个:

#define Vc0        0 
#define Tc1        1.5f
uint16_t  V30 = 0; 

float TempCal(uint16_t TempAdVal)
{
    float Temperate;
    Temperate=((V30+Vc0-TempAdVal)*3.3/4095)/AVG_SLOPE+30.0f-Tc1;
    return Temperate;
}

可能是公式有问题。

点评

向你学习呀,我回老家,没空做了!    详情 回复 发表于 2022-1-31 11:22
 
 
 

回复

7048

帖子

11

TA的资源

版主

5
 
jinglixixi 发表于 2022-1-31 11:00 用的是这个: #define Vc0        0  #define Tc1       &n ...

向你学习呀,我回老家,没空做了!

 

 
 
 

回复

1144

帖子

17

TA的资源

纯净的硅(高级)

6
 
楼主你看也我的贴子,也是ADC采集的,后来发现硬件总理 ,板子上硬件参考REF+,REF-默认是悬空的,你要连接到VCC和GND,
 
 
 

回复

1144

帖子

17

TA的资源

纯净的硅(高级)

7
 

楼主你看下我的贴子,也是ADC采集的,后来发现硬件问理 ,

板子上硬件参考REF+,REF-默认是悬空的,你要连接到VCC和GND,

点评

原来是这样,感谢!  详情 回复 发表于 2022-2-10 09:00
 
 
 

回复

1532

帖子

1

TA的资源

五彩晶圆(初级)

8
 
fxyc87 发表于 2022-2-10 08:51 楼主你看下我的贴子,也是ADC采集的,后来发现硬件问理 , 板子上硬件参考REF+,REF-默认是悬空的,你要 ...

原来是这样,感谢!

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表