GD32F350開發板使用了兆易最新推出的ARM Cortex-M4的32位通用微控制器GD32F350RB,這款芯片自帶2路比較器,非常適合用來制作一款低成本的數字式電容表。
設計方案:
圖1是由比較器構成的RC自激振蕩電路,R1、R2為比較器正端提供1/2偏壓,R3是正反饋電阻,待測電容Cx與RT、CT決定了振蕩器的輸出頻率,基本不受供電電壓影響。比較器負輸入端與輸出端的波形見圖2。當RT和CT固定不變時,比較器輸出端PT1輸出的方波頻率與待測電容Cx的容量成反比。
圖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進行計數。
圖3
同時,為開發板配置了一片OLED顯示屏用來顯示測試結果,相關原理圖見圖4。使用洞洞板焊接了所需的外擴電路。
圖4
B、軟件資源:
軟件流程很簡單,見圖5.
圖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、主要代碼
圖4
B、軟件資源:
軟件流程很簡單,見圖5.
圖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文章
38瀏覽量
16321 -
gd32f350
+關注
關注
3文章
3瀏覽量
3288
原文標題:基于GD32F350的數字式電容表
文章出處:【微信號:gh_dae0718828df,微信公眾號:gh_dae0718828df】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論