华大单片机-HC32L13X系列芯片OPA配置-芯虎论坛

在进行一些项目时,可能会接收一些信号,根据要求我们可能需要对这些信号进行放大、反向输出、阻抗匹配等处理。
这些时候就需要焊接相应的信号处理电路配合运放芯片来处理,这就为这些项目增加了或多或少的成本。
在精度允许的范围呢,如果选用内部集成有OPA模块的MCU便能直接完成这些处理,节约成本。
HC32L13X系列芯片内部集成了三个独立配置运放OPA,通过寄存器选择可以配置为各种不同的PGA模式,也可以配置为用户使用外部元件的运放功能。
运放的输出可以作为ADC的通道输入。
详细讲解下PGA模式:
1.单位增益PGA这种模式下OPA的负端输入与OPA的输出连通。用于单位增益的电压跟随器。
在这里插入图片描述2.正向增益PGA
正向增益与反向增益的倍数都由PGAGAIN(3位)控制。
在这里插入图片描述在这里插入图片描述
3.反向增益PGA!在这里插入图片描述在这里插入图片描述

4.级联反向输入PGA
PGA的增益由三个OPA共同决定。这种模式下不支持7和14的增益。
在这里插入图片描述
在这里插入图片描述
5.级联正向输入PGA
增益由三个OPA增益共同决定。
在这里插入图片描述
在这里插入图片描述
6.两运放差分PGA
两运放差分只支持OPA0,OPA1的连接。
在这里插入图片描述
在这里插入图片描述

PS:这部分的重点在于如何配置寄存器来选择自己想要的PGA模式,以及如何计算增益倍数来获得相应的信号。
本文转自:“芯虎论坛”
http://www.tigerchip.com.cn/forum.php?mod=viewthread&tid=356&extra=

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
STM32单片机(STM32F429)读写(8通道带PGA的24位ADC)ADS1256软件例程源码,可以做为你的学习设计参考。 int main(void) { uint8_t i; bsp_Init(); PrintfLogo(); /* 打印例程Logo到串口1 */ bsp_DelayMS(100); /* 等待上电稳定,等基准电压电路稳定, bsp_InitADS1256() 内部会进行自校准 */ bsp_InitADS1256(); /* 初始化配置ADS1256. PGA=1, DRATE=30KSPS, BUFEN=1, 输入正负5V */ /* 打印芯片ID (通过读ID可以判断硬件接口是否正常) , 正常时状态寄存器的高4bit = 3 */ #if 0 { uint8_t id; id = ADS1256_ReadChipID(); if (id != 3) { printf("Error, ASD1256 Chip ID = 0x%X\r\n", id); } else { printf("Ok, ASD1256 Chip ID = 0x%X\r\n", id); } } #endif ADS1256_CfgADC(ADS1256_GAIN_1, ADS1256_30SPS); /* 配置ADC参数: 增益1:1, 数据输出速率 1KHz */ ADS1256_StartScan(); /* 启动中断扫描模式, 轮流采集8个通道的ADC数据. 通过 ADS1256_GetAdc() 函数来读取这些数据 */ while (1) { bsp_Idle(); /* 空闲时执行的函数,比如喂狗. 在bsp.c中 */ /* 打印采集数据 */ for (i = 0; i < 8; i++) { int32_t iTemp; iTemp = ((int64_t)g_tADS1256.AdcNow[i] * 2500000) / 4194303; /* 计算实际电压值(近似估算的),如需准确,请进行校准 */ if (iTemp < 0) { iTemp = -iTemp; printf("%d=%6d,(-%d.%03d %03d V) ", i, g_tADS1256.AdcNow[i], iTemp /1000000, (iTemp%1000000)/1000, iTemp%1000); } else { printf("%d=%6d,( %d.%03d %03d V) ", i, g_tADS1256.AdcNow[i], iTemp/1000000, (iTemp%1000000)/1000, iTemp%1000); } } printf("\r\n"); bsp_DelayMS(500); /* 每隔500ms 输出一次数据 */ } }
以下是HC32L13X芯片的UART串口模块配置示例代码: ```c #include "hc32l13x.h" void UartInit(void) { stc_uart_config_t stcUartConfig; stc_uart_multimode_t stcMulti; stc_uart_baud_t stcBaud; //使能UART外设时钟 Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0, TRUE); //配置PD5为UART0_TX,PD6为UART0_RX Gpio_SetFunc_UART0TX_P05(); Gpio_SetFunc_UART0RX_P06(); //UART配置结构体清零 Mem_Zero(&stcUartConfig, sizeof(stcUartConfig)); Mem_Zero(&stcMulti, sizeof(stcMulti)); Mem_Zero(&stcBaud, sizeof(stcBaud)); //UART基本配置 stcUartConfig.enRunMode = UartMode1; stcUartConfig.enStopBit = Uart1bit; stcUartConfig.enMmdorCk = UartMmd; stcUartConfig.u32Baudrate = 9600; //UART多主机模式配置 stcMulti.enMulti_mode = UartNormal; stcMulti.u8Slave_addr = 0x00u; stcMulti.enBitDirection = UartDataLsbFirst; stcMulti.enBitLength = UartEightBits; stcMulti.enDetectMode = UartSingleEnd; stcMulti.enPeforDetect = UartMmd; stcMulti.enRtOrTxDetect = UartMmd; stcMulti.enAddressMatch = UartAddMatch0; stcMulti.enBitType = UartData; //UART波特率配置 stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); stcBaud.enRunMode = UartMode1; stcBaud.u32Baud = stcUartConfig.u32Baudrate; //配置UART外设 Uart_Init(UARTCH0, &stcUartConfig, &stcMulti); Uart_SetBaudrate(UARTCH0, &stcBaud); Uart_EnableFunc(UARTCH0, UartRx); } ``` 该代码中,首先使能了UART外设时钟,然后配置了PD5为UART0_TX,PD6为UART0_RX。接着定义了三个结构体变量,分别用于UART的基本配置、多主机模式配置和波特率配置。最后通过调用`Uart_Init()`、`Uart_SetBaudrate()`和`Uart_EnableFunc()`函数来完成UART外设的配置。 需要注意的是,该代码仅作为示例,具体的配置根据实际需求进行调整。同时,配置UART时需要确保时钟配置正确,并且使能对应的GPIO引脚功能,否则可能会导致UART无法正常工作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值