1. 辉芒微FT62FCC开发实战解析
作为一名长期使用ARM架构芯片的嵌入式工程师,初次接触辉芒微(FMD)的FT62FCC系列单片机时,确实遇到了不少挑战。这款芯片在电机控制和触摸检测领域有着独特的优势,特别是在成本敏感型应用中表现出色。本文将基于一个交流有刷电机控制项目,详细分享FT62FCC的开发经验。
FT62FCC是辉芒微电子推出的8位增强型单片机,内置电容式触摸检测模块,工作频率最高16MHz,具备2K×16位Flash程序存储器和128字节RAM。其最大特点是集成了高灵敏度的电容触摸检测电路,非常适合家电控制面板等需要触摸输入的应用场景。
2. 硬件设计与引脚分配
2.1 系统架构设计
本项目需要实现以下核心功能:
- 5路高灵敏度触摸按键检测
- 交流过零信号采集
- 可控硅电机驱动控制
- 红外遥控信号解码
- 数码管/LED显示驱动
系统采用AC-DC模块供电,主控芯片工作电压为5V。触摸按键采用PCB上设计的电容式触摸盘,通过FT62FCC内置的触摸检测模块实现。电机驱动采用双向可控硅方案,通过过零检测实现精确的相位控制。
2.2 关键引脚功能分配
根据项目需求,我们对FT62FCC的I/O引脚进行了如下配置:
| 引脚 | 方向 | 功能说明 |
|---|---|---|
| PA0 | 输出 | COM1 (数码管公共端1) |
| PA1 | 输入 | OSC1 (晶体振荡器输入) |
| PA2 | 输入 | OSC2 (晶体振荡器输出) |
| PA3 | 输出 | COM2 (数码管公共端2) |
| PA4 | 输入 | TIMER_Key3 (触摸按键3) |
| PA5 | 输入 | IR_IN (红外信号输入) |
| PA6 | 输入 | ON/OFF_Key1 (电源按键) |
| PA7 | 输入 | GL (过零检测输入) |
| PD0 | 输入 | SPEED_Key2 (速度调节按键) |
| PD1 | 输出 | SEG_C (数码管C段) |
| PB0 | 输出 | SEG_D (数码管D段) |
| PB1 | 输出 | SEG_E (数码管E段) |
| PB2 | 输入 | Sleep_Key5 (睡眠按键) |
| PB3 | 输入 | OSC_Key4 (振荡器控制按键) |
| PD4 | 输出 | SEG_G (数码管G段) |
| PB4 | 输出 | SEG_F (数码管F段) |
| PB5 | 输出 | SEG_COM (数码管公共端) |
| PB6 | 输出 | SEG_A (数码管A段) |
| PB7 | 输出 | SEG_B (数码管B段) |
| PC0 | 输出 | TRIAC_L (低速可控硅控制) |
| PC1 | 输出 | TRIAC_ML (中低速可控硅控制) |
| PC2 | 输出 | TRIAC_M (中速可控硅控制) |
| PC5 | 输出 | TRIAC_OSC (振荡器控制) |
| PC6 | 输出 | TRIAC_H (高速可控硅控制) |
| PD5 | 输入 | C_Ref (电容参考) |
| PC7 | 输出 | TRIAC_MH (中高速可控硅控制) |
注意:在PCB布局时,触摸按键相关引脚应远离高频信号线和大电流走线,避免引入干扰影响触摸灵敏度。
3. 触摸按键开发详解
3.1 电容触摸原理
FT62FCC采用电荷转移电容检测技术。当手指接近触摸盘时,会形成一个额外的对地电容(Cx)。芯片内部通过测量这个电容的变化来检测触摸动作。实际检测的是触摸盘与地之间的等效电容,其变化量ΔC与触摸面积、介电常数等因素相关。
触摸检测电路工作时,会先对触摸盘充电,然后通过内部开关将电荷转移到检测电容上,通过多次累积后测量电压变化。这种技术对微小电容变化非常敏感,能够检测到手指接近时的几个pF级电容变化。
3.2 VisualTouchTL配置
辉芒微提供了专用的触摸配置工具VisualTouchTL,使用步骤如下:
-
软件安装:务必使用与芯片固件版本匹配的VisualTouchTL版本,否则可能导致配置无法烧录。建议从官网下载最新版本。
-
工程创建:
- 选择正确的芯片型号(FT62FCC)
- 设置工作频率(本项目使用16MHz)
- 选择触摸通道(对应实际使用的PA4/PD0等引脚)
-
参数配置:
- 勾选CS(电荷分享)和EMI(抗干扰)选项,这对稳定性至关重要
- 根据需求选择"高灵敏度"模式(会修改滤波算法)
- AC供电项目可不选低功耗模式
-
阈值调整:
- KeyX_ON:触摸触发阈值
- KeyX_OFF:触摸释放阈值
- 建议先设置ON=30,OFF=20作为基准,再根据实测调整
-
环境校准:
- 在裸板和工作环境中分别进行校准
- 记录两种环境下的基准电容值差异
- 适当增大ON/OFF差值可提高抗干扰能力
3.3 触摸按键代码实现
FT62FCC的触摸检测通过库函数实现,主要API包括:
c复制void TSC_Init(void); // 触摸模块初始化
void TSC_Scan(void); // 执行触摸扫描
uint8_t TSC_DataProcessing(void); // 数据处理
uint8_t TSC_GetCsKey(void); // 获取最强按键
uint8_t TSC_GetLocalKey(void); // 获取所有按键状态
典型的主循环处理逻辑:
c复制while(1) {
CLRWDT(); // 清看门狗
TSC_Scan(); // 执行触摸扫描
if(TSC_DataProcessing() == 1) { // 完成一次完整扫描
strongest = TSC_GetCsKey(); // 当前最强按键(1-5)
single = TSC_GetLocalKey(); // 所有按键状态(位掩码)
// 按键状态处理
if(strongest > 0) {
// 有按键按下
key_handler(strongest);
}
}
// 其他任务处理
}
经验分享:当多个按键同时按下时,TSC_GetCsKey()会返回0。此时应结合TSC_GetLocalKey()的位掩码值进行判断。建议在PCB设计时保持按键间距≥15mm,减少同时误触概率。
3.4 触摸灵敏度调试技巧
-
基准值测量:
- 在无触摸状态下记录各通道基准值
- 确保各通道基准值差异<10%,否则检查硬件
-
触发阈值设置:
- ON值一般设为基准值的120-150%
- OFF值设为基准值的105-120%
- ON-OFF差值建议≥5,避免临界抖动
-
环境适应性处理:
- 在整机装配前后分别测量基准值
- 考虑温度变化影响(建议工作温度0-60℃)
- 可添加自动校准功能,定期更新基准值
-
抗干扰措施:
- PCB上触摸走线尽量短
- 周围铺地保护,但避免形成太大寄生电容
- 必要时添加RC低通滤波(如1kΩ+100pF)
4. 过零检测与电机控制
4.1 过零检测电路
交流过零检测电路原理:
code复制AC输入 → 电阻分压 → 光耦隔离 → 施密特整形 → PA7
关键参数:
- 分压电阻:通常用2个1MΩ串联
- 光耦:推荐TLP521,CTR>20%
- 整形电路:74HC14或专用比较器
4.2 过零检测代码实现
FT62FCC通过PORTA中断检测过零信号:
c复制// 中断服务程序
void interrupt ISR(void) {
if(PAIE && PAIF) { // PORTA中断
uint8_t port_val = PORTA; // 读取端口状态
PAIF = 0; // 清除中断标志
if(port_val & 0x80) { // PA7变化
GLflag = 1; // 设置过零标志
}
}
}
// 初始化
void PA7_Init(void) {
ANSEL0 &= ~0x80; // 禁用模拟功能
TRISA7 = 1; // 输入模式
WPUA7 = 0; // 禁用弱上拉
IOCA7 = 1; // 使能PA7变化中断
PAIE = 1; // 使能PORTA中断
GIE = 1; // 全局中断使能
}
注意事项:交流信号存在抖动,建议在检测到过零后延时1-2ms再执行关键操作,避开抖动区。
4.3 可控硅驱动控制
可控硅驱动时序:
- 检测到过零信号
- 延时对应相位角(控制速度)
- 触发可控硅导通
- 维持触发信号≥1ms
典型驱动代码:
c复制void TRIAC_Control(uint8_t speed) {
static uint16_t delay_angle[5] = {800,600,400,200,100}; // 不同速度对应的延时(us)
if(GLflag) { // 过零信号
GLflag = 0;
delay_us(delay_angle[speed]); // 相位延时
// 触发对应可控硅
switch(speed) {
case 0: TRIAC_L = 1; break;
case 1: TRIAC_ML = 1; break;
case 2: TRIAC_M = 1; break;
case 3: TRIAC_MH = 1; break;
case 4: TRIAC_H = 1; break;
}
delay_us(1000); // 维持触发
TRIAC_L = TRIAC_ML = TRIAC_M = TRIAC_MH = TRIAC_H = 0; // 关闭所有可控硅
}
}
可控硅选型建议:
- 电流规格:≥负载电流的2倍
- 电压规格:≥600V
- 推荐型号:BTA16-600B(16A/600V)
5. 红外接收与数码管显示
5.1 红外信号解码
由于交流电源干扰,采用定时器中断方式解码:
c复制// 定时器2初始化(100us中断)
void TIM2_Init(void) {
T2CON0 = 0x01; // 预分频1:4
T2CON1 = 0x00; // 系统时钟源
PR2 = 200; // 16MHz/4/200=20kHz(50us)
TMR2IE = 1;
TMR2ON = 1;
}
// 中断服务程序
void interrupt ISR(void) {
if(TMR2IF) {
TMR2IF = 0;
ir_decode_100us(); // 红外解码
}
}
// 红外解码逻辑
void ir_decode_100us(void) {
static uint16_t pulse_cnt = 0;
if(IR_IN == 1) { // 高电平
pulse_cnt++;
if(pulse_cnt > 100) { // 10ms引导码
ir_state = IR_LEADER;
}
}
else { // 低电平
if(ir_state == IR_LEADER && pulse_cnt > 80) {
ir_state = IR_DATA;
ir_data = 0;
}
else if(ir_state == IR_DATA) {
ir_data <<= 1;
if(pulse_cnt > 5) ir_data |= 1; // 长脉冲为1
if(++ir_bit_cnt >= 8) {
ir_key = ir_data; // 获取键值
ir_state = IR_IDLE;
}
}
pulse_cnt = 0;
}
}
抗干扰措施:
- 在IR_IN引脚添加100nF电容
- 软件滤波(连续3次相同结果才确认)
- 避免与触摸按键共用接地回路
5.2 数码管驱动实现
动态扫描驱动要点:
- 先关闭所有COM端
- 设置段码
- 开启对应COM端
- 保持时间≥1ms
代码实现:
c复制// 数码管显示函数
void display_digit(uint8_t num, uint8_t pos) {
// 段码表(共阴)
static const uint8_t seg_table[10] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
// 关闭所有COM
COM1 = COM2 = COM3 = 1;
// 设置段码
uint8_t seg = seg_table[num];
SEG_A = (seg >> 0) & 1;
SEG_B = (seg >> 1) & 1;
SEG_C = (seg >> 2) & 1;
SEG_D = (seg >> 3) & 1;
SEG_E = (seg >> 4) & 1;
SEG_F = (seg >> 5) & 1;
SEG_G = (seg >> 6) & 1;
// 开启对应COM
switch(pos) {
case 0: COM1 = 0; break;
case 1: COM2 = 0; break;
case 2: COM3 = 0; break;
}
}
显示刷新建议:
- 扫描频率≥100Hz(每位数码管≥3ms)
- 使用定时器中断定时刷新
- 避免在显示刷新期间执行耗时操作
6. 系统整合与优化
6.1 主程序框架
c复制void main(void) {
// 硬件初始化
System_Init();
Touch_Init();
PA7_Init();
TIM2_Init();
Display_Init();
// 主循环
while(1) {
// 触摸按键处理
if(TSC_DataProcessing() == 1) {
uint8_t key = TSC_GetCsKey();
if(key) Key_Handler(key);
}
// 电机控制
if(GLflag) {
Motor_Control();
GLflag = 0;
}
// 显示刷新
if(display_timer >= DISPLAY_INTERVAL) {
Display_Refresh();
display_timer = 0;
}
// 其他任务...
}
}
6.2 低功耗设计技巧
虽然本项目为AC供电,但仍可优化功耗:
- 空闲时降低主频(16MHz→4MHz)
- 关闭未使用外设(ADC、PWM等)
- 数码管采用1/3占空比扫描
- 触摸检测间隔可适当延长
6.3 抗干扰设计经验
-
电源处理:
- 添加10μF+100nF去耦电容
- 线性稳压器前加π型滤波
- 敏感电路单独供电
-
PCB布局:
- 触摸走线远离高频信号
- 数字地与模拟地单点连接
- 关键信号包地处理
-
软件容错:
- 关键数据CRC校验
- 看门狗定时复位
- 异常状态自动恢复
7. 常见问题排查
7.1 触摸按键不灵敏
可能原因及解决方案:
-
阈值设置不当:
- 重新测量基准值
- 适当增大ON值(增量10-20%)
-
PCB设计问题:
- 检查触摸盘尺寸(建议≥10mm直径)
- 确认触摸走线长度<5cm
- 避免触摸盘下方有地层
-
环境干扰:
- 远离电机、变压器等干扰源
- 尝试降低EMI灵敏度设置
7.2 过零检测不稳定
排查步骤:
- 测量PA7波形,确认信号干净
- 检查光耦输出端上拉电阻(建议10kΩ)
- 添加施密特触发器整形
- 软件增加去抖处理(连续3次检测)
7.3 可控硅误触发
解决方案:
- 在G-M间添加100Ω电阻
- 触发脉冲加至2ms
- 并联0.01μF/100V电容
- 检查散热是否良好
7.4 显示闪烁或残影
优化方法:
- 增加扫描频率至150Hz以上
- COM端开关间隔加入1μs死区
- 检查段驱动电流是否足够(2-5mA)
- 避免在显示刷新时执行耗时操作
经过实际项目验证,FT62FCC在电机控制应用中表现稳定可靠,其内置的触摸检测模块大大简化了设计难度。对于初次接触FMD芯片的开发者,建议从官方例程入手,重点关注触摸配置和中断处理两个关键环节。
