STM32控制CD74HC4067十六通道模拟开关以及遇到的一些问题

STM32控制CD74HC4067十六通道模拟开关

  • CD74HC4067
  • STM32控制原理和代码
  • 出现的问题以及解决方法
  • CD74HC4067

    CD74HC4067 作用是选通一路对十六路模拟信号,更详细的说,根据芯片上 S0-S3 四个不同管脚的组合,让SIG管脚和C0-C15导通。因此,最常见的用法是用来测试模拟信号。比如,Arduino Uno上面只有6个模拟输入,用一个CD74HC4067可以多扩展出来16个,于是可以支持 6+16-1=21个模拟引脚。
    一开始原理图上没注意使能引脚接地的,默认是使能状态,换句话说,EN使能引脚是可以通过电平控制的(后面在做项目的时候由于默认低电平使能吃亏了)后面我会在具体说。(高电平断开 低电平使能)
    芯片手册概述如图所示

    STM32控制原理和代码

    一开始默认使能状态,就直接通过S0-S3引脚的组合来控制C0-C15(16个通道的导通就可以了)

    具体的代码思路就是把四个使能的引脚写到一个数组当中,然后用一个二维数组模拟出16个通道的情况,在用循环把4个通道的情况写入。不多说,具体看代码。

    // 写入到函数当中,方便MAIN中调用
    void readMux1(int channel)
    {
    	int controlpin[4]={GPIO_PIN_12,GPIO_PIN_13,GPIO_PIN_14,GPIO_PIN_15}; //这里我使用的是PB12-PB14
    	int i;
    	int muxChannel[16][4]=
    	{
    
        {0,0,0,0}, //channel 0
    
        {1,0,0,0}, //channel 1
    
        {0,1,0,0}, //channel 2
    
        {1,1,0,0}, //channel 3
    
        {0,0,1,0}, //channel 4
    
        {1,0,1,0}, //channel 5
    
        {0,1,1,0}, //channel 6
    
        {1,1,1,0}, //channel 7
    
        {0,0,0,1}, //channel 8
    
        {1,0,0,1}, //channel 9
    
        {0,1,0,1}, //channel 10
    
        {1,1,0,1}, //channel 11
    
        {0,0,1,1}, //channel 12
    
        {1,0,1,1}, //channel 13
    
        {0,1,1,1}, //channel 14
    
        {1,1,1,1}  //channel 15
    
      };
    	
    	for(i = 0; i < 4; i ++)
    	{
    	   HAL_GPIO_WritePin(GPIOB,controlpin[i],muxChannel[channel][i]);
    	
    	}
    }
    
    // MAIN函数的调用
    int main()
    {
    		 for(j = 0; j < 16; j++)
    		{
    			  readMux(j); //调用需要配置的通道
                HAL_Delay(1);  //这里配置完一个通道需要进行延迟,不然通道会出现问题
            }
            return 0;
    }
    
    

    出现的问题以及解决方法

    因为项目的需要,需要两个模拟开关对32个通道进行循环开启,所以直接就把两个模拟开关打在同一个板子上面,并且两个使能引脚同时接地,以为没有问题,结果程序写好之后,发现两个芯片会产生干扰,一个模拟开关的通道会影响另一个模拟开关的所有通道。最后找了半天问题发现两个开关不能同时使能工作。解决方法就是把两个开关的使能引脚接入MCU,通过MCU来进行使能。
    解决了两个通道相互影响的问题。大概代码如下。

    	PB11_ENABLE;  
        PB10_DISABLE;//防止对另一个通道造成影响
        HAL_Delay(1); //突变的原因是因为使能之后不能立刻读取数据,需要延迟一下
       	for(k=0;k<16;k++)
       	{
       	    readMux1(k);  //控制通断
            HAL_Delay(1);
        }
       PB10_ENABLE;
       PB11_DISABLE;
       HAL_Delay(1);
    		
      for(j = 0; j < 16; j++)
    	{
            readMux1(j);  //控制通断
            HAL_Delay(1);
        }
    

    第一次写博客,简单的记录一下。工程都是HAL库配置的
    参考链接:http://www.lab-z.com/cd74hc4067/

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32控制CD74HC4067十六通道模拟开关以及遇到的一些问题

    发表评论