137 PGA

本文介绍了一种使用PGA放大器将微弱信号放大并转换为ADC可处理信号的方法。通过PGA模块放大四倍的信号,然后由ADC进行采样,最后在循环中读取和处理ADC值。实验结果显示,PGA和ADC配合良好,能够实现信号的精确放大和转换。
#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输出误差问题。

04-03
<think>好的,我现在需要回答用户关于PGA(可编程门阵列)的问题。首先,用户提到可能与PGA相关,但缺乏上下文,所以我要先确认PGA的定义和基本概念。 首先,PGA的全称是Programmable Gate Array,即可编程门阵列。根据我的知识,PGA属于FPGA(现场可编程门阵列)的一种类型,或者可能用户将两者混淆了。需要明确两者的区别和联系。可能PGA和FPGA在某些文献中被交替使用,但严格来说,FPGA是更常见的术语。我需要确认这一点,避免给出错误信息。 接下来,我应该解释PGA的基本结构和工作原理。例如,PGA由可编程逻辑块、互连资源和I/O单元组成,用户可以通过编程配置这些资源来实现特定的电路功能。这里需要确保技术术语的准确性,比如逻辑块、查找表(LUT)、触发器、可编程互连等。 然后,需要提到PGA的应用领域,比如数字电路设计、原型验证、嵌入式系统等。同时,可能需要比较PGA与ASIC(专用集成电路)的优势和劣势,比如灵活性、开发周期、成本等方面。 用户的问题可能还涉及到PGA的编程方式,比如使用硬件描述语言(HDL)如Verilog或VHDL,以及综合工具将代码转换为配置位流。此外,可能需要提到常见的PGA厂商,如Xilinx和Intel(原Altera),但要注意这些厂商主要生产FPGA,所以需要澄清术语是否一致。 在回答过程中,需要遵循用户给出的系统级指令:使用中文,数学公式用$...$和$$...$$格式,正确使用LaTeX语法,生成相关问题。同时,确保回答结构清晰,分点说明,帮助用户逐步理解。 可能还需要检查是否有引用需求。用户提供的引用标识示例中,引用了快速排序的相关内容,但当前问题涉及PGA,可能需要引用相关文献或资料。不过由于用户没有提供具体的引用来源,这里可能需要省略引用,或者假设某些常识内容不需要引用。 最后,生成的相关问题需要围绕PGA展开,比如工作原理、与FPGA的区别、应用场景、设计流程等。确保问题具有针对性,能够帮助用户进一步探索该主题。 现在需要组织这些思路,形成结构化的回答,并确保符合所有格式要求。同时,要避免使用Markdown,保持自然的中文表达,分步骤解释,并在末尾添加相关问题。</think>### 关于PGA(可编程门阵列)的解析 PGA(Programmable Gate Array,可编程门阵列)是一种可通过编程配置实现定制数字电路功能的半导体器件。它由可编程逻辑单元、互连资源和输入输出模块组成,允许用户根据需求设计专用电路,兼具灵活性和高性能[^1]。 #### 核心特点 1. **可重构性** PGA的逻辑功能可通过硬件描述语言(如Verilog/VHDL)定义,经综合工具生成配置位流(bitstream)后加载到器件中。例如,一个加法器电路可表示为: ```verilog module adder(input [3:0] a, b, output [4:0] sum); assign sum = a + b; endmodule ``` 2. **并行计算能力** 与CPU顺序执行不同,PGA的电路可并行运行。例如,两个独立乘法运算$z_1 = x_1 \times y_1$和$z_2 = x_2 \times y_2$可在同一时钟周期内完成。 3. **低延迟处理** 信号传输路径通过硬件直接实现,避免了软件栈开销。例如,图像滤波算法的延迟可降低至微秒级。 #### 与FPGA的关系 - **术语差异**:FPGA(Field-Programmable Gate Array,现场可编程门阵列)是更通用的名称,强调“现场可编程”(即用户可自行配置),而PGA有时指早期或特定类型的可编程器件。 - **技术演进**:现代FPGA集成更多资源(如DSP模块、高速串行接口),而传统PGA可能功能较基础。 #### 典型应用场景 - **通信系统**:实现5G基带信号处理中的FFT运算 - **嵌入式加速**:在自动驾驶中实时处理传感器数据 - **原型验证**:ASIC设计前的功能仿真
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值