2376|2

205

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

[极海M3内核 APM32E103VET6S MINI开发板]05.ADC高速采样和DAC模拟外设功能 [复制链接]

 

APM32E103VET6S带有3个采样精度达到12位的ADC单元,每个ADC单元最多有16个外部通道和2个内部通道。其中ADC1和ADC2有16个外部通道、ADC3一般有8个外部通道;每个通道都支持单次、连续、扫描和间断的工作方式,支持左右对齐的数据存储方式。对于ADC来说,最大时钟频率为14MHz,最短的采样周期为14个周期,采样的电压范围由VREF来决定;通过APM32E103VET6S MINI开发板我们来实现一路ADC采样功能,程序配置如下:

/*******************************************************************************
 * @brief  * @param       
 * @retval      
 * @attention  *******************************************************************************/
void ADC_MultiTimerCallback(MultiTimer *timer, void *userData)
{
    ADC_EnableSoftwareStartConv(ADC1);

    while(ADC_ReadSoftwareStartConvStatus(ADC1) != BIT_RESET);

    ADC_ClearStatusFlag(ADC1, ADC_FLAG_EOC);

    uint32_t Value = ADC_ReadConversionValue(ADC1);

    printf("\r\nADC Voltage : %0.1fv", (float)Value / 4096.0 * 3.3);

    MultiTimerStart(&ADC_MultiTimer, 1000, ADC_MultiTimerCallback, "ADC");
}


/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void ADC_Init(void)
{
    ADC_Config_T  ADC_ConfigStruct;
    GPIO_Config_T GPIO_ConfigStruct;

    RCM_ConfigADCCLK(RCM_PCLK2_DIV_4);  /* ADCCLK = PCLK2/4 */

    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1 );
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);

    GPIO_ConfigStructInit(&GPIO_ConfigStruct);
    GPIO_ConfigStruct.pin   = GPIO_PIN_2;
    GPIO_ConfigStruct.mode  = GPIO_MODE_ANALOG;
    GPIO_Config(GPIOA, &GPIO_ConfigStruct);

    ADC_ConfigStructInit(&ADC_ConfigStruct);
    ADC_ConfigStruct.mode               = ADC_MODE_INDEPENDENT;
    ADC_ConfigStruct.scanConvMode       = DISABLE; 
    ADC_ConfigStruct.continuosConvMode  = ENABLE;
    ADC_ConfigStruct.externalTrigConv   = ADC_EXT_TRIG_CONV_None; 
    ADC_ConfigStruct.dataAlign          = ADC_DATA_ALIGN_RIGHT; 
    ADC_ConfigStruct.nbrOfChannel       = 1;
    ADC_Config(ADC1, &ADC_ConfigStruct);

    ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_2, 1, ADC_SAMPLETIME_239CYCLES5);

    ADC_Enable(ADC1);

    ADC_ResetCalibration(ADC1);
    while(ADC_ReadResetCalibrationStatus(ADC1));

    ADC_StartCalibration(ADC1);
    while(ADC_ReadCalibrationStartFlag(ADC1));

    MultiTimerStart(&ADC_MultiTimer, 1000, ADC_MultiTimerCallback, "ADC");
}

 

运行结果:

我们使用的PA2这个引脚做ADC采样通道,当PA2悬空时,采样到的电压为1.6V即:(VREF+)+(VREF-))/2,当PA2接GND时,采样电压为0V,当PA2按VDD时,采样电压为3.3V,如下图所示:

 

APM32E103VET6S带有2路DAC输出引脚,分别为PA4和PA5,这两路通道互不影响;通道有多个触发源可触发转换,可单路触发转换,也可双路触发转换;另外除了输出固定的电平外,这两个通道还都可以生产噪声波形和三角波形。通过APM32E103VET6S MINI开发板我们来实现2路DAC输出固定电平,然后通过ADC来读取DAC输出的电平电压,打印输出,程序配置如下:

/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void DAC_Init(void)
{
    DAC_Config_T  DAC_ConfigStruct;
    GPIO_Config_T GPIO_ConfigStruct;

    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_DAC  );
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);

    GPIO_ConfigStructInit(&GPIO_ConfigStruct);
    GPIO_ConfigStruct.pin   = GPIO_PIN_4 | GPIO_PIN_5;
    GPIO_ConfigStruct.mode  = GPIO_MODE_ANALOG;
    GPIO_Config(GPIOA, &GPIO_ConfigStruct);

    DAC_ConfigStructInit(&DAC_ConfigStruct);
    DAC_ConfigStruct.trigger             = DAC_TRIGGER_NONE;
    DAC_ConfigStruct.waveGeneration      = DAC_WAVE_GENERATION_NONE;
    DAC_ConfigStruct.maskAmplitudeSelect = DAC_TRIANGLE_AMPLITUDE_4095;
    DAC_ConfigStruct.outputBuffer        = DAC_OUTPUT_BUFFER_DISABLE;

    DAC_Config((uint32_t)DAC_CHANNEL_1, &DAC_ConfigStruct);
    DAC_Config((uint32_t)DAC_CHANNEL_2, &DAC_ConfigStruct);
    
    DAC_Enable(DAC_CHANNEL_1);
    DAC_Enable(DAC_CHANNEL_2);
    
    DAC_ConfigDualChannelData(DAC_ALIGN_12BIT_R, (uint16_t)(4096.0*1.0/3.3), (uint16_t)(4096.0*2.2/3.3));
}

 

运行结果:

将PA2引脚连接PA4或PA5进行测量(PA2在切换/悬空的时候,采样到的电压为1.6V左右),PA4输出电压为1.0V,PA5输出电压为2.2V,如下图所示:

 

 

软件工程源代码:

Project.zip (298.33 KB, 下载次数: 5)

 

 

补充/建议:

对于ADC和DAC的例程,在APM32E10x_SDK_V1.1版本的例程示例都比较少,建议是否可以多补充一些常用的示例程序呢?

最新回复

感谢您对极海半导体的关注和建议,我们后续将进行SDK版本迭代,同时也会不断丰富相关例程   详情 回复 发表于 2022-9-30 09:49
点赞 关注
个人签名We are a team and we work as a team !
 
 

回复
举报

12

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

感谢您对极海半导体的关注和建议,我们后续将进行SDK版本迭代,同时也会不断丰富相关例程

 
 
 

回复

205

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
傲娇树獭 发表于 2022-9-30 09:49 感谢您对极海半导体的关注和建议,我们后续将进行SDK版本迭代,同时也会不断丰富相关例程

个人签名We are a team and we work as a team !
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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