OPA-单运放双通道采集
CH32V003 系列单片机内部仅集成了一个 OPA,但该运算放大器提供了 2 组输入引脚供我们选择。可以通过分时复用的方法,切换外部输入引脚,达到采集并放大两路输入信号的目的。
在芯片应用手册(V1.6)的第 17 章节配置扩展控制寄存器中,可以发现 OPA 的正、负端通道的选择是由两个位进行控制,这又允许我们在使用不同的输入通道时使用同一套反馈电路。
最终运算放大器外围电路可以简化为下图所示,RC 滤波、偏置电压与其他功能根据实际项目需求另行添加。注意,PD7 引脚在出厂时默认为复位引脚功能,在编写软件时,应将其配置为普通 IO 引脚。
调用 Option_Byte_CFG 函数,将 PD7 配置为普通 IO 引脚,该函数使用一次即可,后续再上电芯片将自动执行修改后的配置。
1 void Option_Byte_CFG(void) 2 { 3 FLASH_Unlock(); 4 FLASH_EraseOptionBytes(); 5 FLASH_UserOptionByteConfig(OB_IWDG_SW, OB_STOP_NoRST, 6 OB_STDBY_NoRST, OB_RST_NoEN ,OB_PowerON_Start_Mode_BOOT); 7 FLASH_Lock(); 8 }
初始化 OPA 对应的引脚与通道,当需要切换通道时,调用 OPA_CH0_Init 或 OPA_CH1_Init 函数切换运放正端的输入引脚,达到运放时分复用的效果。
1 void OAP_GPIO_Init( void ){ 2 GPIO_InitTypeDef GPIO_InitStructure = {0}; 3 4 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE ); 5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; 6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 7 GPIO_Init( GPIOD, &GPIO_InitStructure ); 8 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 10 GPIO_Init( GPIOD, &GPIO_InitStructure ); 11 12 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); 13 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; 14 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 15 GPIO_Init( GPIOA, &GPIO_InitStructure ); 16 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 17 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 18 GPIO_Init( GPIOA, &GPIO_InitStructure ); 19 } 20 21 void OPA_CH0_Init( void ) 22 { 23 OPA_InitTypeDef OPA_InitStructure = {0}; 24 25 OPA_InitStructure.PSEL = CHP0; 26 OPA_InitStructure.NSEL = CHN0; 27 OPA_Init( &OPA_InitStructure ); 28 OPA_Cmd( ENABLE ); 29 } 30 31 void OPA_CH1_Init( void ){ 32 OPA_InitTypeDef OPA_InitStructure = {0}; 33 34 OPA_InitStructure.PSEL = CHP1; 35 OPA_InitStructure.NSEL = CHN0; 36 OPA_Init( &OPA_InitStructure ); 37 OPA_Cmd( ENABLE ); 38 }
最后使用 ADC 对结果进行转换,串口打印 OPA 放大后通道 1 与通道 2 的电压。
2024-1-31