1,040
社区成员
发帖
与我相关
我的任务
分享本人最近在准备电赛模块,想要做一个程控滤波器模块(还未做出,后续做好后应该也会发帖)。因为我用的是程控滤波芯片MAX264,既可以单电源供电又可以双电源。但单电源供电会有限制,所以打算使用双电源供电。这样就遇到了一个问题,双电源供电后几个控制滤波器参数的引脚的高低电平变成了VCC和VEE,即低电平不是0V,而是变成了负供电电压-5V。而单片机无法产生负电压,也就不能对滤波器进行控制。所以我想到了使用模拟开关,单片机控制模拟开关进而控制MAX264参数引脚。而我需要的模拟开关数量又较多,所以就使用了今天要讨论的芯片:8x16 模拟开关阵列芯片 CH446Q。
CH446Q 是 8x16 矩阵模拟开关芯片。CH446Q 包含 128 只模拟开关,分布于8x16 信号通道矩阵的各个交叉点,每只模拟开关都可以独立的开启或者关闭,从而实现 8x16 信号通道的任意路由。

1、CH446Q 内置 128只独立的模拟开关,分布于 8x16 信号通道矩阵的各个交叉点。
2、CH446Q 支持 7 位并行地址输入,兼容现有同类产品。
3、支持串行地址移位输入,节约引脚。
4、支持 4V 到 12V 单电源电压,支持+5V 和 -7V 双电源电压。

参考上述的框图,CH446Q芯片内部分为三个部分:接口控制逻辑、128只锁存器、128只模拟开关阵列。其中的接口控制逻辑还包含了串行地址到并行地址转化。
128只模拟开关分布于由16个X端口和8个Y端口组成的8x16矩阵的每个交叉点,使得任意一个X端口和任意一个Y端口之间能够在需要时导通或者断开,甚至可以使某两个X端口分别导通到某个Y 端口,实现任意两个X端口之间或者任意两个Y端口之间的间接导通。
128只锁存器用于分别控制128只模拟开关的导通或者断开,128只锁存器被编址为0到127,由7位地址 ADDR6~ADDR0译码后选择。从RST引脚输入高电平复位信号可以将所有锁存器清0,从而导致所有模拟开关断开。需要开启或者关闭某一模拟开关时,应该通过7位的 ADDR提供锁存器的地址,并通过DAT提供开关数据〈1则导通,0则关闭),然后产生一个ACT激活脉冲,将开关数据写入由ADDR译码指定的锁存器,实现对指定的某个模拟开关的控制。
接口控制逻辑主要用于产生 ADDR地址和ACT激活脉冲。在并行地址输入方式下,由引脚AX0~AX3、AY0~AY2从低到高构成7位地址输入ADDR0~ADDR6,当CS/CK引脚输入的片选信号为高电平时,由STB引脚输入的高电平选通脉冲产生ACT激活脉冲,当CS/CK引脚为低电平时,不产生 ACT信号。在串行地址输入方式下,由CS/CK引脚输入时钟,在其每个上升沿,从 DAT引脚依次输入ADDR6、ADDR5直到 ADDR1、ADDR0(分别对应于AY2、AY1直到 AX1、AX0),CS/CK引脚需要提供7个上升沿得到7位地址,并由STB引脚输入的高电平选通脉冲直接产生ACT激活脉冲。
实际上,在并行地址输入方式下,ACT信号是CS/CK引脚输入和STB引脚输入的“与”,而在串行地址输入方式下,ACT信号只是来自STB引脚的输入。RST复位信号优先于ACT信号,当RST输入高电平时,ACT信号将被忽略,所有锁存器总是被清0。在ACT激活脉冲有效期间,DAT引脚可以动态改变输入的开关数据,并使得相应的模拟开关实时地导通或者关闭,但是在ACT信号结束之前(即STB的下降沿之前),DAT引脚的输入数据应该保持稳定以便正确地锁存数据。
单片机7个引脚依次连接到7位输入地址ADDR0~ADDR6,给入脉冲并行输入地址。
下表为CH446Q 芯片 7 位地址 ADDR 的译码真值表,也是 128 只模拟开关的编址表。

串行输入能大量的节省单片机的引脚资源,我这次采用的就是串行输入方式。
串行地址输入方式下的控制步骤:通过 DAT 引脚依次提供 7 位地址并用 CS/CK 引脚的 7 个上升沿移入 CH446,通过 DAT 引脚提供数据、向 STB 引脚提供一个高电平脉冲。
如果单片机通过 SPI 总线连接 CH446X,那么 SPI 提供的一字节 8 位数据的位 7 将被 CH446 丢弃,SPI 的位 6 到位 0 作为地址,单片机 SPI 的串行数据输出引脚连接 DAT 引脚提供开关数据,单片机使用一个独立引脚控制 CH446 的 STB 引脚。
下图为一个串行地址输入的实例,控制 24H 地址(Y2 和 X4 之间)的模拟开关,先开再关。

在7位地址输入完毕后仍需输入一位以控制该地址开关的状态。
如果 VEE 接负电压,那么模拟开关可以通过负电压的模拟信号,否则 VEE 接 GND,模拟开关只能通过高于-0.3V 的模拟信号。
由于模拟电路与数字电路共用 VDD,为减少干扰,VDD 和 VEE 引脚必须外接退耦电容,并且建议将数字输入信号的边沿适当放缓,降低传输频率。另外,对于强干扰的应用环境,单片机可以每隔数秒定期对 CH446 进行刷新,确保各个模拟开关处于正确的开关状态。
图为CH446Q电路

/* **************************************************
// 函数功能:延时ms函数
// 参数:
************************************************** */
void delay_ms(u16 ms)
{
u16 i,j;
for(i=0;i<ms;i++)
for(j=0;j<12;j++);
}
/* **************************************************
// 函数功能:CH466Q模拟开关复位,所有通道关闭
// 参数:
************************************************** */
void Control_Switch_Reset(void)
{
CH446Q_RST = 1;
delay_ms(1);
CH446Q_RST = 0;
}
/* **************************************************
// 函数功能:CH466Q模拟开关通道选择导通
// 参数: Address:选择的开关地址
// State: 为1,该开关导通
// 为0,该开关关闭
************************************************** */
void Control_Switch_State(u8 Address,u8 State)
{
u8 ByteCnt;
CH446Q_STB = 0;
CH446Q_DAT = 0;
delay_ms(1);
for(ByteCnt = 0;ByteCnt < 7;ByteCnt++)
{
CH446Q_CLK = 0;
if(Address & 0x40)
{
CH446Q_DAT = 1;
}
else
{
CH446Q_DAT = 0;
}
CH446Q_CLK = 1;
Address <<= 1;
}
CH446Q_CLK = 0;
if(State == 1)
{
CH446Q_DAT = 1;
}
else
{
CH446Q_DAT = 0;
}
CH446Q_STB = 1;
delay_ms(1);
CH446Q_STB = 0;
}
void main(void)
{
Control_Switch_Reset();
Control_Switch_State(0x00, 1); //Y0,X0导通
Control_Switch_State(0x01, 1); //Y0,X1导通
while(1)
{
}
}
以上只是我对于这几天的学习的一个总结。本人也是一名学生,学识浅薄,上述如有错误,大家可以直接在评论区提出来,共同进步。