TCA9555与数码管和DRV8833应用综述

「C++ 40 周年」主题征文大赛(有机会与C++之父现场交流!) 10w+人浏览 403人参与

TCA9555与数码管和DRV8833应用综述

一、TCA9555 GPIO扩展器应用案例

1. 数码管驱动方案

硬件配置

  • 使用TCA9555的PORT0(P00-P07)控制数码管段选
  • PORT1的P10-P11控制数码管位选
  • 共阴数码管,330Ω限流电阻

驱动原理

// 数码管段码表(0-9,共阴)
const uint8_t digitMap[10] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F// 9
};

// 动态扫描显示
void refreshDisplay() {
static uint8_t digit = 0;

// 关闭所有位选
writeTCA9555(PORT1, 0xFF);

// 设置段选数据
writeTCA9555(PORT0, digitMap[displayValue[digit]]);

// 开启当前位选
uint8_t bitmask = ~(1 << digit);
writeTCA9555(PORT1, bitmask);

digit = (digit + 1) % DIGIT_COUNT;
}
2. 按钮检测方案
// 初始化配置
void initButtons() {
// 设置PORT1低2位为输入
writeTCA9555(CONFIG_REG, 0x03);
}

// 读取按钮状态
uint8_t readButtons() {
uint8_t state = readTCA9555(INPUT_REG);
return state & 0x03; // 仅取低2位
}

二、DRV8833电机驱动应用

1. 直流电机控制

典型接线

AIN1 -- PWM信号1
AIN2 -- 方向信号1
BIN1 -- PWM信号2
BIN2 -- 方向信号2

控制逻辑

// 电机控制函数
void setMotorSpeed(int motor, int speed) {
bool dir = (speed >= 0);
speed = abs(speed);

if(motor == MOTOR_A) {
digitalWrite(AIN1, dir);
digitalWrite(AIN2, !dir);
analogWrite(PWM_A, speed);
}
else {
digitalWrite(BIN1, dir);
digitalWrite(BIN2, !dir);
analogWrite(PWM_B, speed);
}
}
2. 步进电机控制
// 步进电机相位表
const uint8_t stepPhases[4] = {
0b0001, // A+
0b0010, // B+
0b0100, // A-
0b1000// B-
};

void stepMotor(int direction) {
static uint8_t phase = 0;

phase = (phase + direction + 4) % 4;

// 设置DRV8833控制引脚
digitalWrite(IN1, stepPhases[phase] & 0x01);
digitalWrite(IN2, stepPhases[phase] & 0x02);
digitalWrite(IN3, stepPhases[phase] & 0x04);
digitalWrite(IN4, stepPhases[phase] & 0x08);
}

三、器件对比分析

特性TCA9555DRV8833
主要功能GPIO扩展电机驱动
接口类型I2C数字IO+PWM
通道数量16路GPIO双H桥
电流能力25mA/引脚1.5A/通道
工作电压2.3-5.5V2.7-10.8V
关键应用显示控制/按钮扫描电机/机械臂控制
保护功能过温保护过流/过热/欠压保护

四、系统集成方案

智能小车控制系统

void controlSystem() {
// 1. 读取传感器数据
uint8_t btnState = readTCA9555Buttons();

// 2. 根据按钮控制电机
if(btnState & UP_BUTTON) {
setMotorSpeed(MOTOR_A, 200);
setMotorSpeed(MOTOR_B, 200);
}
else if(btnState & DOWN_BUTTON) {
setMotorSpeed(MOTOR_A, -150);
setMotorSpeed(MOTOR_B, -150);
}

// 3. 更新速度显示
displaySpeed(currentSpeed);

// 4. 动态扫描数码管
refreshDisplay();
}

五、设计注意事项

  1. TCA9555使用技巧
  • 上电时默认所有引脚为输入
  • 配置寄存器需在输出操作前设置
  • I2C时钟不宜超过400kHz
  • 驱动LED需外接限流电阻
  1. DRV8833设计要点
  • 电机电源与逻辑电源隔离
  • 并联100μF电解电容+0.1μF陶瓷电容
  • 散热片必要时应添加
  • 避免同时导通同桥臂的MOSFET
  1. 抗干扰措施
// 添加消抖处理
#define DEBOUNCE_TIME 50

uint8_t stableButtonRead() {
static uint32_t lastChange = 0;
static uint8_t lastState = 0;

uint8_t current = readButtons();
if(current != lastState) {
lastChange = millis();
lastState = current;
return 0xFF; // 无效状态
}

if(millis() - lastChange > DEBOUNCE_TIME) {
return current;
}
return 0xFF;
}

六、典型应用电路

TCA9555+数码管接线:
P00-P07 → 数码管段选(a-g, dp)
P10-P11 → 数码管位选(共阴)
P12-P15 → 按钮输入
DRV8833驱动电路:
VM → 电机电源(2.7-10.8V)
VCC → 逻辑电源(3.3V/5V)
AIN1/AIN2 → MCU PWM+方向
OUT1/OUT2 → 电机线圈A

七、总结建议

  1. TCA9555最佳实践
  • 用于低刷新率显示系统(<200Hz)
  • 适合按钮/开关状态监测
  • 可扩展传感器阵列
  1. DRV8833使用场景
  • 电池供电移动设备
  • 需要双路独立控制的系统
  • 低电压步进电机应用
  1. 联合使用方案
  • 机器人状态显示+电机控制
  • 智能家居控制面板
  • 工业设备人机界面

通过TCA9555实现用户交互,DRV8833执行机械控制,两者结合可构建完整的嵌入式控制系统。实际应用中需注意电源隔离和信号抗干扰设计,特别是电机产生的EMI可能影响I2C通信稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值