#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输出误差问题。