CW爱好者对于电键的追求是永恒的,不光是生产出来的标准产品,他们还会动手制作一些适合自己的电键。触摸键就是在这个过程中发展出来的一个产物。
触摸键利用触摸检测的方法,实现一种减少键体机械结构的电键。现在自制触摸键的一种方法是使用成品的触摸控制器,其电路非常简单。有没有什么更加“折腾”一点的方法呢?今天这种方法就是为了那些想要对单片机的知识有进一步了解的朋友们所介绍的,利用单片机作为主控来实现一个触摸键。
ATTiny4有多小?
首先,这个设计选用了ATTiny4这个非常小的单片机作为主控,但是这并不重要,你手头有什么样的单片机都可以拿来用。我们主要测试的就是手指触碰按键区域前和后,单片机引脚对按键区域的充能时间长短变化。手指触碰到按键区域后,充电放缓。这时候被单片机检测到之后,就可以判定为发生了一次点击。
触摸前后,单片机对铜板的充放电波形
电路非常简单,两个IO口连接到大范围的覆铜上作为按键区域,另两个IO口则连接到MOS管上作为开关使用,开关控制的是电键接头对地的导通,以控制电台。电路图如下图所示:
程序上来看,唯一的一个函数是用来对触控IO口进行操作以获得触控时间的。当函数返回有触控事件发生的时候,则控制将电键相应线路拉至地。从而使电台动作。程序并不复杂,有兴趣的朋友可以仔细阅读并将其移植至其他的单片机。环境是 Atmel Studio 7。试着将其移植到51单片机上吧!
#include
// Define port configuration
#define dit_out PINB2
#define dah_out PINB3
#define dit_in PINB0
#define dah_in PINB1
// Charge time per pin
uint8_t CT(uint8_t pin)
{
uint8_t mask = (1
uint8_t i;
DDRB &= ~mask; // Set pin as input
PORTB |= mask; // Set pin to high
PUEB |= mask; // Enable Pull up resistor
// See how long it takes to toggle from 0 to 1
for (i = 0; i
if (PINB & mask) break;
}
PORTB &= ~mask; // Set pin to low
DDRB |= mask; // Set pin as output
return i; // Return how long it took
}
int main(void)
{
// Set AVR speed to 8Mhz
CCP = 0xD8; // 0xD8 = 8 Mhz
CLKPSR = 0x00; // Sets the clock div factor to 0
// Set output
DDRB |= (1
DDRB |= (1
// Loop to check if a side of the paddle is being touch
while(1)
{
if (CT(dit_in) > 4) // Check for touch
PORTB |= (1
else
PORTB &= ~(1
if (CT(dah_in) > 4) // Check for touch
PORTB |= (1
else
PORTB &= ~(1
}
转载请注明出处:《现代通信》杂志公众号【CQ现代通信】
现代通信,中国火腿自己的杂志
点击我订阅现代通信 2017年全年杂志
↑ 来吧,做出你的选择!↓
点击我购买现代通信 2016年4~6期 下半年杂志
今年我们包快递!不会寄失!
及时获得最新最全、好玩实用的业余无线电资讯!
留言会友台,点赞留余香