137 PGA

#include "bat32g137.h"
#include "pga.h"
#include "dac.h"
#include "adc.h"
#include "EventRecorder.h"              // Keil.ARM Compiler::Compiler:Event Recorder
#include "stdio.h"

static void adc_init(void);
static uint16_t get_adc_value(adc_channel_t ch);
//  PGA通道和DAC相連 然後從ADC中讀取PGA數據。
static uint32_t volatile adc_val = 0;
int main(void)
{
	SystemCoreClockUpdate();
	EventRecorderInitialize(0,0);
	EventRecorderStart();
	// 放大四倍
	PGA_Init(PGA_CHANNEL_0, PGA_VSS_REFERENCE_VOLTAGE, PGA_GAIN_X4);
	PGA_Start(PGA_CHANNEL_0);
	
	adc_init();		
	DAC_Init(DAC_CHANNEL_0);	
	DAC_Start(DAC_CHANNEL_0);		
	DAC_Set_Value(DAC_CHANNEL_0, 10);
	
	while(1)
	{
		for(char i = 0;i < 16;i++){
			adc_val += get_adc_value(ADC_CHANNEL_PGA0);
		}
		printf("pga_x4 = %04d\n",adc_val>>4);
		adc_val = 0;
	}
}

// bref:adc 初始化
// para:
// note:
static void adc_init(void)
{
	// 開啓ADC外設時鐘
	CGC->PER0 |= CGC_PER0_ADCEN_Msk;    /* enables input clock supply */
	// 停止ADC
	ADC->ADM0  = 0x00U;                 /* disable AD conversion and clear ADM0 register */
	// ADC時鐘
	/* AD operation mode: select or scan mode  */
	ADC->ADM0 = _10_AD_CONVERSION_CLOCK_8 | _00_AD_COMPARATOR_DISABLE;
	// 高速模式--轉換週期短
	/* AD conversion mode setting */
	ADC->ADM1 = _00_AD_HISPEED;
	
	// 選擇模式
	ADC->ADM1 |= _00_AD_OPERMODE_SELECT;
	// 單次模式
	ADC->ADM1 |= _08_AD_CONVMODE_ONESHOT;
	ADC->ADNSMP = 15;
	// ADC 參考電源
	ADC->ADM2 = _00_AD_POSITIVE_VDD | _00_AD_NEGATIVE_VSS | _00_AD_AREA_MODE_1 ;
	// 軟件觸發
	ADC->ADTRG = _00_AD_TRIGGER_SOFTWARE;
	// 設置ADC結果上下限
	/* AD comversion result comprision upper limit setting */
	ADC->ADUL = _FF_AD_ADUL_VALUE;
	/* AD comversion result comprision lower limit setting */
	ADC->ADLL = _00_AD_ADLL_VALUE;
	// 上電
	/* adhard power up */
	ADC->ADM0 |= ADCE;  
}

// bref: 獲取ADC值
// para:
// note:
static uint16_t get_adc_value(adc_channel_t ch)
{
	/* Soft Trigger one-shot select mode */
	ADC->ADM1 = _08_AD_CONVMODE_ONESELECT ;
	ADC->ADTRG = _00_AD_TRIGGER_SOFTWARE;
	/* specify ad channel */
	ADC->ADS  = ch; 
	/* ADC start */
	ADC->ADM0 |= ADCS; 
	while(ADC->ADM0 & ADCS);
	/* Get the conversion result */
	return ADC->ADCR;
}

 

PGA很常用模塊,可以把微弱的電流放大然後轉給ADC處理。

DAC 輸出10/256 VCC 反推出來大概是640,上面顯示爲650左右,放大器一般有誤差,誤差再所難免,只要是線性變化的就可以軟件修正。

實際測試DAC輸出爲0.131 反推出來剛好是650.DAC輸出誤差問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章