前言:
手机的3.5mm耳机孔是一个存在很久的外设接口,虽然现在部分手机取消了这个外设,但还是有相当一部分手机有这个外设,这个外设也有它自己的特色,比如接口简单,不需要电池,音频没有延迟等特点。今天我就采集这个耳机口的能量驱动MCU和LED灯。这个麦克风也是一个输入设备,要是能配合对应的软件可以实现数据的传输。
一,耳机插入检测
我找了一个四段的耳机插头插入手机,发现手机屏幕并没有检测到,经过测试是麦克风到地线之间必须有一个负载才可以让手机检测到。我就在麦克风到地线之间接了不同的电阻测试。并测量了接电阻后这个电阻两端的电压。
4.7K-----1.839V-----手机能检测到
10K-----2.299V-----手机能检测到
20K-----2.435V-----手机能检测到
47K-----手机不能检测到
100K-----手机不能检测到
现在的手机用耳机都是四段结构。有2个标准。
OMTP标准:OMTP的毫米接口,插针接法是左声道→右声道→麦克风→地线。
CTIA标准:CTIA的毫米接口,插针接法是左声道→右声道→地线→麦克风。
我的手机是CTIA标准。
二,MCU选择
电阻负载在4.7K到20K之间,能获得的电压是1.83-2.4V之间,现在的MCU绝大部分低压MCU的工作电压是1.8-3.6V。所以能获得的电流是1.839V/4.7K大约等于400uA。这对于一些低功耗MCU来说足够了。这里我选择专业的低功耗单片机MSP430F2013。
MSP430F2013介绍
德州仪器(TI)MSP430系列超低功耗微控制器包含多种器件,它们具有面向多种应用的不同外设集。种架构与5种低功耗模式相组合,专为在便携式测量应用中延长电池的使用寿命而优化。该器件具有一个强大的16位RISC CPU,16位寄存器和有助于获得最大编码效率的常数发生器。数字控制振荡器(DCO)可在不到1μs的时间里完成从低功耗模式至运行模式的唤醒。
MSP430F2013是一个具有内置16位时钟和10个I /O针脚的超低功率混合信号微控制器。除此之外,MSP430F2013有一个使用同步协议(SPI或I2C)的内置通信组件和一个16位的三角积分(Sigma-Delta)A /D转换器。
典型应用包括传感器系统,此类系统负责捕获模拟信号,将之转换为数字值,随后对数据进行处理以进行显示或传送至主机系统。独立射频(RF)传感器前端属于另外的应用域。
特性
低电源电压范围:1.8 V至3.6 V
超低功耗
运行模式:220μA(在1MHz频率和2.2V电压条件下)
待机模式:0.5μA
关断模式(RAM保持):0.1μA
5种节能模式。
可在不到1μs的时间里超快速地从待机模式唤醒。
16位RISC架构,62.5ns指令周期。
基本时钟模块配置:
高达16 MHz的内部频率并具有4种浮动范围在±1%之内的校准频率。
内部超低功耗低频振荡器。
32-kHz晶体晶体振荡器不能在温度超过105°C的环境中工作。
外部数字时钟信号源。
具有两个捕捉/比较寄存器的16位时钟_A。
16位三角积分(Sigma-Delta)A /D转换器。
具有差动PGA输入和内反射ADC最高工作温度105°C。
支持SPI和I2C的通用串行接口(USI)。
欠压检测器。
串行上编程时,无需外部编程电压,由安全熔丝(Security Fuse)对可编程代码进行保护
具有Spy-Bi-Wire接口的片上仿真逻辑电路。
2KB + 256B闪存; 128B RAM。
开发板:
电路板
电路:
为了MCU工作的稳定,在VCC和GND增加了100uF电容。单片机工作在VLO模式超低功耗下,主频MCLK = VLO/8 约等于1.5kHz,LED不闪时工作电流小于1uA。
代码:
#include <msp430.h>
int main(void)
{
volatile unsigned int i; // Volatile to prevent removal
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
IFG1 &= ~OFIFG; // Clear OSCFault flag
__bis_SR_register(SCG1 + SCG0); // Stop DCO
BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = LFXT1/8
P1DIR = 0xFF; // All P1.x outputs
P1OUT = 0; // All P1.x reset
P2DIR = 0xFF; // All P2.x outputs
P2OUT = 0; // All P2.x reset
for (;;)
{
P1OUT |= 0x01; // P1.0 set
for (i = 2; i > 0; i--); // Delay
P1OUT &= ~0x01; // P1.0 reset
for (i = 100; i > 0; i--); // Delay
}
}
视频:
led