STM32F4控制多路选择器7HC4501

235 阅读2分钟

1.多路选择器有关知识

  1. 模拟多路选择就是一个多路选择开关

image.png

这是我选用的芯片,但是不得不说某宝真的假货多,(经过测试某宝上的几块钱的是一个4选1的,S2管脚没有作用,而且选择对应的选通通道也是对应错误。

  1. 对应的原理图和真值表
  • 原理图

image.png

  • 真值表

image.png 3. 一般都要看datasheet(百度都可以搜到)

2. 代码

  • MUX.h
#ifndef _mux_H
#define _mux_H


#include "system.h"




void MUX_Init(void);
void selectMuxPin(int pin);

#endif
  • MUX.c
#include "mux.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F429开发板
//ADG706驱动代码	   
//华南理工大学电活性
//创建日期:2021/04/23
//版本:V1.0
//版权所有,盗版必究。
//All rights reserved									  
////////////////////////////////////////////////////////////////////////////////// 	

//初始化PB1为输出.并使能时钟	    
//MUX IO初始化
/*这里PB5先去掉是因为使用的普中开发板中的PB5连接了蜂鸣器(低电平有效)*/
const int selectPins[8] = {GPIO_PIN_3, GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7, GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_10}; //放入数组有利于进行选择通道,只放如选择的通道PD3-PD10


void MUX_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	  __HAL_RCC_GPIOD_CLK_ENABLE();           //开启GPIOD时钟
	
    GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; //PB3-PB10, PD11用于多路选择器的使能
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_NOPULL;          //不用上下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
	
	  GPIO_Initure.Pin=GPIO_PIN_11; // PD11用于多路选择器的使能
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_NOPULL;          //不用上下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOD,&GPIO_Initure);


	
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_RESET);	//PD11置0,默认初始化使能打开	(7HC40多路选择器默认E是低电平使能(这句代码可以不用)
		for (int i=0; i<3; i++)
			{
				HAL_GPIO_WritePin(GPIOB, selectPins[i], GPIO_PIN_SET);     //默认初始化关闭   当i=0时候蜂鸣器会叫
//				PBout(i) = GPIO_PIN_SET;
			}

//				PDout(11) = GPIO_PIN_RESET;
}


void selectMuxPin(int pin)
{
  for (int i=0; i<3; i++)
  {
    if (pin & (1<<i))
      HAL_GPIO_WritePin(GPIOB, selectPins[i], GPIO_PIN_SET);
//				PBout(i) = GPIO_PIN_SET;
    else
      HAL_GPIO_WritePin(GPIOB, selectPins[i], GPIO_PIN_RESET);
//				PBout(i) = GPIO_PIN_RESET;
  }
}

3. 测试结果

  • 实际结果对应关系
S2S1S0channel
000Y4
001Y6
010Y5
011Y7
100Y4
101Y6
100Y5
111Y7
  • 测试结果得到S2管脚没有任何作用

4. 总结

  • 测试的时候没有得到想要的结果,可以先检查代码有没有问题,(前提是买的模块)模块一般不会出问题
  • 然后单步调试检查管脚参数是否给对了值。
  • 如果测试代码没有问题,就要开始怀疑硬件是否有问题,可以去咨询厂家或者商家
  • 最后就是要耐心的进行调试

5. 参考资料