#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輸出誤差問題。