目录

16.01_OPA-输出到IO

测试步骤

使能OPA0,内部增益设置为160k:40k,并输出到P2.7。 测试时输入信号固定N端为1V,P端从0.5-1.5V之间线性变化。

实测数据

输出电压

误差

受到测试环境的性能限制,这里的放大倍数和误差仅供参考

参考代码

16.01_OPA_Config.c

/**
 * @brief OPA-输出到IO
 * @details 使能OPA0,内部增益设置为160k:40k,并输出到P2.7。
 * 测试时输入信号固定N端为1V,P端从0.5-1.5V之间线性变化。
 */

#include "lks32mc09x_opa.h"
volatile uint32_t opa_out = OPA_OUT_CMP_OUT0P;
/**
 * @brief 主函数
 */
int main(void)
{
    OPA_Enable(OPA_CHANNEL_0);
    OPA_Enable(OPA_CHANNEL_1);
    OPA_Enable(OPA_CHANNEL_2);
    OPA_Enable(OPA_CHANNEL_3);
    OPA_SetGain(OPA_CHANNEL_0, OPA_GAIN_4);
    OPA_OutCmpSignal(OPA_OUT_CMP_OUT0P, 1);
    while (1)
    {
        OPA_OutCmpSignal(opa_out, 1);
    }
}

使用到的库函数

库函数部分代码

#define OPA_CHANNEL_0 0
#define OPA_CHANNEL_1 1
#define OPA_CHANNEL_2 2
#define OPA_CHANNEL_3 3
#define SYS0 ((SYS_TypeDef *)(SYS_BASE))

/**
 * @brief OPA 使能
 * @param OPA_CHANNEL_x OPA通道
 */
void OPA_Enable(uint32_t OPA_CHANNEL_x)
{
    SYS0->PROTECT = 0x7a83;
    switch (OPA_CHANNEL_x)
    {
        case OPA_CHANNEL_0:
            SYS0->AFE_REG1 |= BIT12;
            break;
        case OPA_CHANNEL_1:
            SYS0->AFE_REG1 |= BIT13;
            break;
        case OPA_CHANNEL_2:
            SYS0->AFE_REG1 |= BIT14;
            break;
        case OPA_CHANNEL_3:
            SYS0->AFE_REG1 |= BIT15;
            break;
    }
    SYS0->PROTECT = 0;
}
/**
 * @brief OPA 增益设置
 * @param OPA_CHANNEL_x OPA通道
 * @param OPA_GAIN_x OPA增益
 */
void OPA_SetGain(uint32_t OPA_CHANNEL_x, uint32_t OPA_GAIN_x)
{
    SYS0->PROTECT = 0x7a83;
    switch (OPA_CHANNEL_x)
    {
        case OPA_CHANNEL_0:
            SYS0->AFE_REG0 = (SYS0->AFE_REG0 & ~(3)) | OPA_GAIN_x;
            break;
        case OPA_CHANNEL_1:
            SYS0->AFE_REG0 = (SYS0->AFE_REG0 & ~(3 << 2)) | (OPA_GAIN_x << 2);
            break;
        case OPA_CHANNEL_2:
            SYS0->AFE_REG0 = (SYS0->AFE_REG0 & ~(3 << 4)) | (OPA_GAIN_x << 4);
            break;
        case OPA_CHANNEL_3:
            SYS0->AFE_REG0 = (SYS0->AFE_REG0 & ~(3 << 6)) | (OPA_GAIN_x << 6);
            break;
    }
    SYS0->PROTECT = 0;
}
/**
 * @brief OPA 输出信号选择(使能输出到GPIO)
 * @param OPA_OUT_CMP_x OPA_OUT_CMP信号来源配置
 * @param Out2Gpio OPA_OUT_CMP输出到IO使能,P2.7
 */
void OPA_OutCmpSignal(uint32_t OPA_OUT_CMP_x, uint32_t Out2Gpio)
{
    SYS0->PROTECT  = 0x7a83;
    SYS0->AFE_REG2 = (SYS0->AFE_REG2 & ~(0xf)) |
                     (OPA_OUT_CMP_x) |
                     (Out2Gpio << 3);
    SYS0->PROTECT = 0;
}