GD32 ADC采集电压

文章目录

    • ADC
    • TIM
    • DMA
    • 其他一些初始化
    • main
    • 总结

使用芯片为GD32F307

ADC

连续转换模式,可以运行在规则组通道上,一旦相应软件触发或者外部触发产生,ADC就会采样和转换规定的通道。

采样时间,每个通道可以用不同的时间采样。ADC使用若干个ADC_CLK周期对输入的电压进行采样,在12位分辨率的情况下,总转换时间=采样时间+12.5个ADCCLK周期。

采样周期数目可以通过ADC_SAMPT0和ADC_SAMPT1寄存器的SPTn[2:0]位更改。如下面所示。

如果想要采样的频率比较快,那么可以设置采样时间为1.5个ADCCLK周期。

/* ADC channel sample time */
#define SAMPTX_SPT(regval)               (BITS(0,2) & ((uint32_t)(regval) << 0))     /*!< write value to ADC_SAMPTX_SPT bit field */
#define ADC_SAMPLETIME_1POINT5           SAMPTX_SPT(0)                               /*!< 1.5 sampling cycles */
#define ADC_SAMPLETIME_7POINT5           SAMPTX_SPT(1)                               /*!< 7.5 sampling cycles */
#define ADC_SAMPLETIME_13POINT5          SAMPTX_SPT(2)                               /*!< 13.5 sampling cycles */
#define ADC_SAMPLETIME_28POINT5          SAMPTX_SPT(3)                               /*!< 28.5 sampling cycles */
#define ADC_SAMPLETIME_41POINT5          SAMPTX_SPT(4)                               /*!< 41.5 sampling cycles */
#define ADC_SAMPLETIME_55POINT5          SAMPTX_SPT(5)                               /*!< 55.5 sampling cycles */
#define ADC_SAMPLETIME_71POINT5          SAMPTX_SPT(6)                               /*!< 71.5 sampling cycles */
#define ADC_SAMPLETIME_239POINT5         SAMPTX_SPT(7)                               /*!< 239.5 sampling cycles */

外部触发输入的上升沿可以触发规则组或注入组的转换。规则组的外部触发源由ADC_CTL1寄存器的ETSRC[2:0]位控制。外部触发信号的上升沿可以启动转换,那么就可以利用定时器的PWM输出模式获得上升沿。

这里选用TIMER0 CH0作为规则组的外部触发源。

在这里插入图片描述

DMA请求,设置ADC_CTL1寄存器的DMA位使能,ADC在规则组一个通道转换结束后产生一个DMA请求,DMA接受到请求后,将转换的数据从ADC_RDATA寄存器传输到用户指定的目的地址。RDATA[15:0],规则通道数据,这些位包含了规则通道的转换结果,只读。

下面的程序,其实还是根据手册的说明,修改寄存器的值,只不过用了一些库函数。

void rcu_config(void)
{/* enable GPIOC clock */rcu_periph_clock_enable(RCU_GPIOC);/* enable GPIOA clock */rcu_periph_clock_enable(RCU_GPIOA);  /* enable DMA clock */rcu_periph_clock_enable(RCU_DMA0);/* enable TIMER0 clock */rcu_periph_clock_enable(RCU_TIMER0);/* enable ADC0 clock */rcu_periph_clock_enable(RCU_ADC0);/* config ADC clock */rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);//rcu_periph_clock_enable(RCU_DAC);
}void gpio_config(void)
{gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
}void adc_config(void)
{
//配置ADC同步模式 ADC_MODE_FREE模式每个ADC都独立工作adc_mode_config(ADC_MODE_FREE);  
//配置ADCx数据对齐方式adc_data_alignment_config(ADC0,ADC_DATAALIGN_RIGHT);
//使能或禁能ADC特殊功能-扫描模式选择adc_special_function_config(ADC0,ADC_SCAN_MODE,ENABLE);  
//配置规则通道组或注入通道组的长度 通道长度,规则通道组为1-16,注入通道组为1-4adc_channel_length_config(ADC0,ADC_REGULAR_CHANNEL,1);
//配置ADC规则通道组 ADC通道选择-采样时间adc_regular_channel_config(ADC0, 0,ADC_CHANNEL_10, ADC_SAMPLETIME_1POINT5);
//配置ADC外部触发adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
//配置ADC外部触发源 TIMER0 CH0事件adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_T0_CH0);
//使能ADCx外设adc_enable(ADC0);delay_1ms(1);    
//ADCx校准复位 A/D 转换前执行校准操作,软件设置CLB=1来对校准进行初始化,
//校准期间CLB位会一直保持1,直到校准完成,该位由硬件清0。adc_calibration_enable(ADC0);
//ADCx DMA请求使能adc_dma_mode_enable(ADC0);
}

TIM

输出比较模式,TIMERx可以产生时控脉冲,当一个输出通道的TIMERx_CHxCV寄存器与计数器的值匹配时,根据CHxCOMCTL的配置,这个通道的输出可以被置高电平,被置低电平或者反转。

在PWM输出模式下,通道根据TIMERx_CAR寄存器和TIMERx_CHxCV寄存器的值,输出PWM波形,EAPWM(边沿对齐PWM)的周期由TIMERx_CAR寄存器值决定,占空比由TIMERx_CHxCV寄存器值决定。

PWM0模式,在向上计数时,一旦计数器值小于TIMERx_CH0CV时,O0CPRE为有效电平,否则为无效电平。在向下计数时,一旦计数器的值大于TIMERx_CH0CV时,O0CPRE为无效电平,否则为有效电平。

void timer_config(void)
{timer_oc_parameter_struct timer_ocintpara;timer_parameter_struct timer_initpara;/* TIMER0 configuration */timer_initpara.prescaler         = 0;timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;//对齐模式timer_initpara.counterdirection  = TIMER_COUNTER_UP;timer_initpara.period            = 224;timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;timer_initpara.repetitioncounter = 0;timer_init(TIMER0, &timer_initpara);/* CH0 configuration in PWM mode0 */timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;//通道输出极性timer_ocintpara.outputstate = TIMER_CCX_ENABLE;//通道输出状态timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);//外设TIMERx的通道输出配置timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 56);//配置外设TIMERx的通道输出比较值timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);//配置外设TIMERx通道输出比较模式 PWM模式0timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);//禁能输出比较影子寄存器/* TIMER0 所有的通道输出使能 */timer_primary_output_config(TIMER0, ENABLE);/* TIMERx自动重载影子使能 */timer_auto_reload_shadow_enable(TIMER0); /* enable TIMER0 */timer_enable(TIMER0);
}

DMA

ADC0外设请求被映射到DMA0通道0,下面就对DMA0通道0配置。

在这里插入图片描述

设置方向是外设到存储器。

CNT[15:0],该寄存器表明还有多少数据等待被传输。一旦通道使能,该寄存器为只读的,并在每个DMA传输之后值减1。

设置循环模式,循环模式用来处理连续的外设请求,循环模式中,当每次DMA传输完成后,CNT寄存器会被自动重装载为初始设置值。

源地址,规则数据寄存器 (ADC_RDATA) :RDATA[15:0],规则通道数据,这些位包含了规则通道的转换结果,只读。

uint32_t adc_value[120];
void dma_config(void)
{/* ADC_DMA_channel configuration DMA初始化结构体 */dma_parameter_struct dma_data_parameter;/* ADC_DMA_channel deinit */dma_deinit(DMA0, DMA_CH0);/* initialize DMA single data mode */dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;dma_data_parameter.memory_addr = (uint32_t)(adc_value);dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_32BIT;dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_32BIT;dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;dma_data_parameter.number = 120;//DMA通道数据传输数量dma_data_parameter.priority = DMA_PRIORITY_HIGH;  dma_init(DMA0, DMA_CH0, &dma_data_parameter);dma_circulation_enable(DMA0, DMA_CH0);//设置dma中断优先级//nvic_irq_enable(DMA0_Channel0_IRQn, 0, 0);/* enable DMA transfer complete interrupt *///dma_interrupt_enable(DMA0,DMA_CH0, DMA_INT_FTF);/* enable DMA channel */dma_channel_enable(DMA0, DMA_CH0);  
}

其他一些初始化

这个里面修改rcu_adc_clock_config可以改变ADC采集的频率。

//存储adc数据的内存数组
uint32_t adc_value[120];
void rcu_config(void)
{/* enable GPIOC clock */rcu_periph_clock_enable(RCU_GPIOC);/* enable GPIOA clock */rcu_periph_clock_enable(RCU_GPIOA);  /* enable DMA clock */rcu_periph_clock_enable(RCU_DMA0);/* enable TIMER0 clock */rcu_periph_clock_enable(RCU_TIMER0);/* enable ADC0 clock */rcu_periph_clock_enable(RCU_ADC0);/* enable ADC1 clock */rcu_periph_clock_enable(RCU_ADC1);/* config ADC clock */rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);rcu_periph_clock_enable(RCU_DAC);
}void gpio_config(void)
{gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
}

main

    
int main(void)
{rcu_config();systick_config();  gpio_config();timer_config();dma_config();adc_config();gd_eval_com_init(EVAL_COM0);sin_app();uint16_t i =0;while(1){if(i==120) i=0;printf("%.3f\r\n",(float)adc_value[i]* 3.3f / 4096.0f);++i;}
}

总结

连续转换模式运行在规则组通道上,TIMER0 CH0外部触发产生,ADC就会采样和转换指定的通道(ADC0 CHANNEL_10,采集PC0引脚的电压)。

外部触发输入的上升沿可以触发规则组或注入组的转换,利用定时器的PWM输出模式获得上升沿,其中设置定时器的时候,改变计数器自动重载值(TIMERx_CAR)和输出比较值(TIMERx_CH0CV寄存器)可以改变触发的频率。

ADC在规则组一个通道转换结束后产生一个DMA请求,DMA接受到请求后,将转换的数据从ADC_RDATA寄存器传输到用户指定的目的地址。(ADC0外设请求被映射到DMA0通道0)

DAC输出一个电压,加到PC0引脚上,然后用ADC采集。

改采集的频率:使其刚好在一个波形周期采120个点。

主要修改的地方:

rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);//RCU_CKADC_CKAPB2_DIV6
adc_regular_channel_config(ADC0, 0,ADC_CHANNEL_10, ADC_SAMPLETIME_1POINT5);//ADC_SAMPLETIME_1POINT5
timer_initpara.period            = 224;
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 56);//配置外设TIMERx的通道输出比较值
dma_data_parameter.number = 120;//DMA通道数据传输数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAC、ADC、FFT使用总结

目录计算公式波形生成DAC波形频率ADC采样时间离散傅里叶变换DFTFFT计算公式 DAC、ADC、FFT之间有些参数环环相扣&#xff0c;所以先整合一下公式。 1.系统时钟周期72MHZ。 2.定时器的单个时钟周期。 3.定时器的触发周期。 4.正弦波一个周期的时间&#xff0c;其中N为正弦波一…

c++代码根据点位连线_邹军:数控车倒角C与自动倒圆角R编程方法

提示&#xff1a;点击上方↑↑"数控达人"即可每天免费订阅【邹军&#xff0c;十多年数控工作经验&#xff0c;现自创一套有理论&#xff0c;有干货&#xff0c;还有方法论做支撑的实战编程教程(PDF)&#xff0c;从而让你编写程序就像做填空题一样简单。在没有人指引你…

不愿意和别人打交道_始终和人保持距离,最不合群的3星座,孤僻却有真本事,能成大事...

始终和人保持距离&#xff0c;最不合群的3星座&#xff0c;孤僻却有真本事&#xff0c;能成大事巨蟹座巨蟹座的人真的是天生孤僻&#xff0c;他们始终和人保持距离&#xff0c;也不喜欢跟别人打交道&#xff0c;最怕就是应酬的事&#xff0c;看起来很不合群&#xff0c;但是巨蟹…

stc15w4k32s4芯片引脚图片_单片机引脚功能初识及提高(3)

40个接口我们已经了解了29个了&#xff0c;在开始我们 今天的内容之前&#xff0c;我们先对之前的内容总结一下。图片来源网络最小系统电源部分(20脚GND,40脚VCC[5v])复位部分(9脚&#xff0c;给高电平进行复位)下载部分(ISP下载接6&#xff0c;7&#xff0c;8脚&#xff0c;ch…

tsd3dmapper软件使用方法_TOYO模组选型软件使用方法

直线模组选型对于机械工程师和采购人员来说&#xff0c;是最基础的硬性要求。直线滑台模组选型中性能是其中之一&#xff0c;还要根据需求考虑&#xff1a;相对应的&#xff0c;在选购直线滑台模组时&#xff0c;先根据下面几点需求来断定直线滑台模组的详细参数需求。可以参考…

pdf从结构新建书签_强力推荐一款PDF神器

某阅读器作为一款在全球范围内流行的PDF阅读器&#xff0c;能够快速打开、浏览、审阅、注释、签署及打印任何PDF文件&#xff0c;具有轻快、高效、安全等特性&#xff0c;是目前一款带有PDF创建功能的阅读器。此外&#xff0c;它以安全著称&#xff0c;从底层技术、应用设计、功…

二元相图软件_Materials Studio 领先的材料模拟软件

BIOVIA MATERIALS STUDIO拥有完善的建模和模拟工具&#xff0c;能够帮助材料科学与化学领域的研究者对材料中原子、分子结构与性质、性能间的关系进行预测。利用Materials Studio&#xff0c;各工业领域的研究者能够对诸多类型的材料&#xff0c;如制药、催化剂、高分子及复合材…

java8 stream 做累加_《Java 8 in Action》Chapter 1:为什么要关心Java 8

自1998年 JDK 1.0(Java 1.0) 发布以来&#xff0c;Java 已经受到了学生、项目经理和程序员等一大批活跃用户的欢迎。这一语言极富活力&#xff0c;不断被用在大大小小的项目里。从 Java 1.1(1997年) 一直到 Java 7(2011年)&#xff0c;Java 通过增加新功能&#xff0c;不断得到…

fabric go sdk 依赖的安装_从这些角度看 Go 是一门很棒的语言

Go 当前引起了很多关注。让我们看一下 Go 好的部分。我最近用 Go 写了一个 SSH 服务器[1]&#xff0c;在其中启动容器。该项目已经发展到很大规模&#xff0c;并且我向 Go 发起了 PR[2]&#xff0c;以修复我发现的错误。在积累了比 “Hello world&#xff01;” 更多的经验之后…

程序win10_win10该文件没有与之关联的程序来执行操作

当初我遇到这个问题的时候&#xff0c;也是一脸懵&#xff01;在度娘那里尝试了许多种方法&#xff0c;都没有得到解决&#xff01;那些方法我就不一一介绍了&#xff0c;百度一大堆&#xff01;下面就来分享一下我解决的办法&#xff01;1.打开默认程序2.找到设置程序访问和计…

node工程默认url_node 爬虫入门实例,简单易懂

前言本文介绍一个 koa 的爬虫项目&#xff0c;受众对象为初学前端不久的小伙伴&#xff0c;通过这个项目能对 node 爬虫有一个简单的认识&#xff0c;也能自己动手写一些简单的爬虫。项目地址&#xff1a;Fe-Icy/firm-spider​github.com启动 koa 服务Koa (koajs) -- 基于 Node…

xshell6 不更新无法使用_世纪金花商联卡无法正常使用 客服:因门店面临改造,涉及品牌、规则每天都在更新...

有效期10年、无消费限制的世纪金花商联卡在半年前开始无法正常使用&#xff0c;11月22日&#xff0c;世纪金花赛高店内200多个零售品牌&#xff0c;只有一个品牌可以无金额限制地正常使用商联卡&#xff0c;世纪金花各门店每日可使用的品牌数量、规则都在变化&#xff0c;什么时…

linux ls 中文乱码_每天一个linux命令:Linux文件类型与扩展名

Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz &#xff0c;这些文件虽然要用不同的程序来打开&#xff0c;但放在Linux文件类型中衡量的话&#xff0c;大多是常规文件&#xff08;也被称为普通文件&…

linux中cooy命令_Linux:CentOS 7中常用的基础命令

对于学习Linux系统来说&#xff0c;命令是必须熟练掌握的第一个部分。Linux系统中的命令有600多个&#xff0c;但常用的基础命令并不多。虽然不同版本的Linux系统的命令稍有不同&#xff0c;但命令的语法与使用方法基本相同&#xff0c;因此读者只要掌握了CentOS 7中常用的基础…

730阵列卡支持多大硬盘_3分钟告诉你:OPPO Reno普通版和旗舰版的差距到底有多大...

昨天OPPO正式发布了Reno系列手机&#xff1a;分为标准版和旗舰版两款。宣传普通版的售价和旗舰版的卖点是手机厂商一贯的传统。为了搞清楚普通版和旗舰版的差距到底有多大&#xff0c;今天我和大家一起扒一扒这两款手机之间的区别到底有多大&#xff0c;供大家在选机时做一个参…

查看list的形状_用Wordcloud生成指定形状的词云图

wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式&#xff0c;通过词云生成的图片&#xff0c;我们可以更加直观的看出某篇文章的故事梗概。首先贴出一张词云图(以哈利波特小说为例)&#xff1a;在生成词云图之前&#xff0c;首先要做一些准备工作1.安装结巴分词库…

oc引导win方法_[OC更新]机械革命8代、9代标压稳定版更新

加关注这种话银家怎么好意思说出口嘛更新机型机械革命Z2G机械革命Z2AIRG机械革命X3(9th ver)机械革命umi air(1080p ver)机械革命X9TI机械革命X8TI-R机械革命X8TI-G机械革命Z2机械革命Z2AIR机械革命X8TI机械革命X8TI PLUS机械革命X3(8th ver)机械革命S1PLUS(8750H)机械革命X2更…

有机晶体数据库_Cambridge Structural Database 2017 晶体结构分析软件分享

文 / 利刃君微信ID / ziyuanliren666全文共2024字&#xff0c;推荐阅读时间6分钟。剑桥结构数据库系统(The Cambridge Structural Database System&#xff0c;简写为CSDS)是基于X光和中子衍射实验唯一的小分子及金属有机分子晶体的结构数据库&#xff0c;收录了全世界范围内所…

win ftp 指定的密码无效。请键入新密码。_重设OS X (macOS)系统帐户密码的5种方法...

为了保护自己的隐私安全&#xff0c;不少 Mac 用户都会选择给自己的设备设置密码&#xff0c;但是时不时的会出现忘掉密码的情况。分享找回&#xff08;重设&#xff09;OS X &#xff08;macOS&#xff09;系统账号密码的5种方法。如果你忘记了 OS X &#xff08;macOS&#x…

滑动翻页效果_Flutter实现3D效果,一个字,炫!

老孟的博客地址&#xff1a;http://laomengit.com/Flutter 中3D效果是通过Transform组件实现的&#xff0c;没有变换效果的实现&#xff1a;class TransformDemo extends StatelessWidget {overrideWidget build(BuildContext context) {return Scaffold( appBar: AppBar(…