0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于GD32F350的数字式电容表设计方案

单片机爱好者 2018-10-05 09:14 次阅读

GD32F350开发板使用了兆易最新推出的ARM Cortex-M4的32位通用微控制器GD32F350RB,这款芯片自带2路比较器,非常适合用来制作一款低成本的数字式电容表。

设计方案:

图1是由比较器构成的RC自激振荡电路,R1、R2为比较器正端提供1/2偏压,R3是正反馈电阻,待测电容Cx与RT、CT决定了振荡器的输出频率,基本不受供电电压影响。比较器负输入端与输出端的波形见图2。当RT和CT固定不变时,比较器输出端PT1输出的方波频率与待测电容Cx的容量成反比。

基于GD32F350的数字式电容表设计方案

图1

图2

利用GD32F350RB片内自带的轨对轨比较器CMP0,只要外加少量阻容元件,就能构成图1的RC自激振荡电路。然后配置GD32F350的TIMER1每1秒中断1次,读取脉冲个数并计算就能得到待测电容Cx的值。这款低成本的数字电容表的测量范围(具有2位小数的3个自动切换的量程):

1.00pf- 1999.99pf

2.00nf- 999.99nf

1.00uf- 10.00uf

方案实施:

A、硬件资源:

参阅GD32F350手册可知,GD32F350内置的通用比较器可连接的资源非常丰富,用户可以很灵活方便组成各种不同应用功能。本方案(见图3)使用图中红框的连接引脚实现图1自激振荡器功能。比较器的输出直接触发GD32F350内部的EXTI进行计数。

基于GD32F350的数字式电容表设计方案

图3

同时,为开发板配置了一片OLED显示屏用来显示测试结果,相关原理图见图4。使用洞洞板焊接了所需的外扩电路。

基于GD32F350的数字式电容表设计方案

图4

B、软件资源:

软件流程很简单,见图5.

基于GD32F350的数字式电容表设计方案

图5

C、中断资源:

1、ADC_CMP_IRQn

2、CMP0输出中断EXTI21

3、TIMER1_IRQn

D、开发环境:

1、使用MDK5;

2、下载GigaDevice.GD32F30x0_DFP.1.0.0.pack为MDK5添加驱动补丁。

3、 下载GD官方GD32F3x0_Firmware_Library_V1.0.0.rar固件库,直接利用GD32F3x0_Firmware_Library_V1.0.0Template文件夹的演示工程修改添加代码。

在gd_eval_led_init()函数中配置了LED4来监测1秒中断的工作状况,在官方gd32f3x0_eval.h定义的LED有误,请参考http://bbs.eeworld.com.cn/thread-869871-1-1.html进行修改。

E、主要代码

基于GD32F350的数字式电容表设计方案

图4

B、软件资源:

软件流程很简单,见图5.

基于GD32F350的数字式电容表设计方案

图5

C、中断资源:

1、ADC_CMP_IRQn

2、CMP0输出中断EXTI21

3、TIMER1_IRQn

D、开发环境:

1、使用MDK5;

2、下载GigaDevice.GD32F30x0_DFP.1.0.0.pack为MDK5添加驱动补丁。

3、 下载GD官方GD32F3x0_Firmware_Library_V1.0.0.rar固件库,直接利用GD32F3x0_Firmware_Library_V1.0.0Template文件夹的演示工程修改添加代码。

在gd_eval_led_init()函数中配置了LED4来监测1秒中断的工作状况,在官方gd32f3x0_eval.h定义的LED有误,请参考http://bbs.eeworld.com.cn/thread-869871-1-1.html进行修改。

E、主要代码

main()

#include "gd32f3x0.h"

#include

#include "gd32f3x0_eval.h"

#include "oled.h"

static void rcu_config(void);

static void gpio_config(void);

static void nvic_configuration(void);

static void cmp_config(void);

static void timer1_configuration(void);

static void To_Buf(void);

__IO uint32_t CAP_Value,CMP_Count=0x00;__IO uint32_t CAP;

uint8_t Number_buf[12],CAP_OK=0;

int main(void)

{

SystemInit();

rcu_config();

gpio_config();

gd_eval_led_init(LED4);

OLED_Init();

OLED_Clear();

cmp_config();

timer1_configuration();

nvic_configuration();

LCD_Print(8,0,"基于GD32F350的",TYPE16X16,TYPE8X16);

LCD_Print(24,16,"数字电容表",TYPE16X16,TYPE8X16);

CAP_OK=0x00;

while(1)

{

while(CAP_OK==0x00);

To_Buf();

LCD_Print(16,40,Number_buf,TYPE16X16,TYPE8X16);

CAP_OK=0x00;

CMP_Count=0;

}

}

cmp_config()

static void cmp_config(void)

{

cmp_mode_init(CMP0,CMP_VERYLOWSPEED , CMP_PA5, CMP_HYSTERESIS_HIGH);

cmp_output_init(CMP0,CMP_OUTPUT_NONE,CMP_OUTPUT_POLARITY_NOINVERTED);//CMP_OUTPUT_TIMER2IC0

cmp_enable(CMP0);

}

gpio_config()

static void gpio_config(void)

{

gpio_output_options_set(GPIOA,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1|GPIO_PIN_5);

gpio_mode_set(GPIOA,GPIO_MODE_ANALOG, GPIO_PUPD_PULLUP, GPIO_PIN_1|GPIO_PIN_5);

gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);

gpio_mode_set(GPIOA,GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);

gpio_af_set(GPIOA,GPIO_AF_7, GPIO_PIN_6);

gpio_output_options_set(GPIOB,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15);

gpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15);

}

nvic_configuration()

static void nvic_configuration(void)

{

nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);

nvic_irq_enable(TIMER1_IRQn,1, 1);

nvic_irq_enable(ADC_CMP_IRQn,0, 1);

exti_init(EXTI_21,EXTI_INTERRUPT,EXTI_TRIG_RISING);

exti_interrupt_enable(EXTI_21);

}

timer1_configuration()

void timer1_configuration(void)

{timer_oc_parameter_struct timer_ocintpara;

timer_parameter_structtimer_initpara;

timer_deinit(TIMER1);

timer_initpara.prescaler=5399;

timer_initpara.alignedmode=TIMER_COUNTER_EDGE;

timer_initpara.counterdirection=TIMER_COUNTER_UP;

timer_initpara.period=1480;

timer_initpara.clockdivision=TIMER_CKDIV_DIV1;

timer_initpara.repetitioncounter= 0;

timer_init(TIMER1,&timer_initpara);

timer_ocintpara.ocpolarity=TIMER_OC_POLARITY_HIGH;

timer_ocintpara.outputstate= TIMER_CCX_ENABLE;

timer_channel_output_config(TIMER1,TIMER_CH_0,&timer_ocintpara);

timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_0,740);

timer_channel_output_mode_config(TIMER1,TIMER_CH_0,TIMER_OC_MODE_TIMING);

timer_channel_output_shadow_config(TIMER1,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);

timer_interrupt_enable(TIMER1,TIMER_INT_CH0);

timer_interrupt_flag_clear(TIMER1,TIMER_INT_CH0);

timer_enable(TIMER1);

}

ADC_CMP_IRQHandler()

void ADC_CMP_IRQHandler(void)

{

CMP_Count++;

EXTI_PD|=0X200000;

}

TIMER1_IRQHandler()

void TIMER1_IRQHandler(void)

{

if(SET== timer_interrupt_flag_get(TIMER1, TIMER_INT_CH0))

{

timer_interrupt_flag_clear(TIMER1,TIMER_INT_CH0);

CAP_Value=CMP_Count;

gd_eval_led_toggle(LED4);

CAP_OK=0x01;

}

}

OLED驱动代码网上彼彼皆是,就不再重复贴出了。

运行结果见图6

图6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电容表
    +关注

    关注

    0

    文章

    31

    浏览量

    16208
  • gd32f350
    +关注

    关注

    3

    文章

    3

    浏览量

    3253

原文标题:基于GD32F350的数字式电容表

文章出处:【微信号:gh_dae0718828df,微信公众号:gh_dae0718828df】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数字式直流毫伏电路图

    数字式直流毫伏电路图 
    发表于 11-25 10:11

    或者 数字式万用的内部结构原理图

    谁有钳或者 数字式万用的内部结构原理图的完整资料,可不可以给我参考,感激不尽
    发表于 04-16 22:12

    diy数字式q

    本帖最后由 gk320830 于 2015-3-8 18:59 编辑 矿坛的小许老师用单片机开发了数字式Q应用系统,其精度高,实用性强,深受矿石机爱好者的好评。我从朋友那得到了许老师的开发板
    发表于 11-28 20:13

    指针数字式万用各有哪些优缺点?

    振荡,放大、分频保护等电路,所以功能较多。比如可以测量温度、频率(在一个较低的范围)、电容、电感,做信号发生器等等。 数字式万用由于内部结构多用集成电路所以过载能力较差,(不过现在有些已能自动换档
    发表于 08-11 10:30

    GD32F350引脚有异常干扰信号输出

    `GD32F350使用Timer1,参照例程,通道1、2、3产生PWM信号正常,当不使用通道2、3时,PB10引脚有不固定的波形输出,怀疑是干扰信号。void timer_config(void
    发表于 11-22 09:35

    求一种数字式温度测量电路的设计方案

    求一种数字式温度测量电路的设计方案
    发表于 05-17 06:16

    分享一款数字式自动答录系统的设计方案

    数字式自动答录系统的原理是什么?怎样去设计数字式自动答录系统的硬件部分?怎样去设计数字式自动答录系统的软件部分?
    发表于 06-03 07:03

    GD32F350运行在8M的目标

    芯片:GD32F350 运行在8M目标:每10ms读取三个adc通道,并且通过DMA传输流程1.配置DMA传输2.配置ADC模式和通道3.配置定时器定时触发4.中断函数和获取足够数据后进
    发表于 08-06 09:25

    请问一下GD32F350芯片是怎样在8M上运行的

    请问一下GD32F350芯片是怎样在8M上运行的?有哪些流程?
    发表于 11-01 06:44

    怎样通过GD32F350去读取ADC通道扫描模式

    怎样通过GD32F350去读取ADC通道扫描模式?并通过DMA传输出来呢?
    发表于 11-08 06:46

    数字式电容计原理图

    数字式电容计原理图
    发表于 04-11 13:49 923次阅读
    <b class='flag-5'>数字式</b><b class='flag-5'>电容</b>计原理图

    数字式电容控制电路

    数字式电容控制电路 数字式
    发表于 09-15 11:34 605次阅读
    <b class='flag-5'>数字式</b><b class='flag-5'>电容</b>控制电路

    GD32F330/GD32F350芯片编程开发手册英文版

    此文档包含GD32F330、GD32F350两种芯片的英文数据开发手册。
    发表于 08-29 09:35 0次下载

    GD32F330/GD32F350芯片编程开发手册中文版

    此文档包含GD32F330、GD32F350两种芯片的中文数据开发手册。
    发表于 08-29 09:35 0次下载

    一种数字式可调直流稳压电源系统设计方案

    一种数字式可调直流稳压电源系统设计方案
    发表于 06-25 10:32 34次下载