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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值