简 介: 通过MM32F3277 MicroPython 产生的PWM 波形经过叠加之后形成DTMF,发送到MT8870D 检测模块。测试了: 这种方波叠加的信号是可以被MT8870D检测到的; 测试了频率允许便宜的范围; 测试了方波的占空比范围;

关键词MT8870MM32F3277

#mermaid-svg-IEH1cciIJ9mSMPHT .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .label text{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .node rect,#mermaid-svg-IEH1cciIJ9mSMPHT .node circle,#mermaid-svg-IEH1cciIJ9mSMPHT .node ellipse,#mermaid-svg-IEH1cciIJ9mSMPHT .node polygon,#mermaid-svg-IEH1cciIJ9mSMPHT .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-IEH1cciIJ9mSMPHT .node .label{text-align:center;fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .node.clickable{cursor:pointer}#mermaid-svg-IEH1cciIJ9mSMPHT .arrowheadPath{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-IEH1cciIJ9mSMPHT .flowchart-link{stroke:#333;fill:none}#mermaid-svg-IEH1cciIJ9mSMPHT .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-IEH1cciIJ9mSMPHT .edgeLabel rect{opacity:0.9}#mermaid-svg-IEH1cciIJ9mSMPHT .edgeLabel span{color:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-IEH1cciIJ9mSMPHT .cluster text{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-IEH1cciIJ9mSMPHT .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-IEH1cciIJ9mSMPHT text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-IEH1cciIJ9mSMPHT .actor-line{stroke:grey}#mermaid-svg-IEH1cciIJ9mSMPHT .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-IEH1cciIJ9mSMPHT #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .sequenceNumber{fill:#fff}#mermaid-svg-IEH1cciIJ9mSMPHT #sequencenumber{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT #crosshead path{fill:#333;stroke:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .messageText{fill:#333;stroke:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-IEH1cciIJ9mSMPHT .labelText,#mermaid-svg-IEH1cciIJ9mSMPHT .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-IEH1cciIJ9mSMPHT .loopText,#mermaid-svg-IEH1cciIJ9mSMPHT .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-IEH1cciIJ9mSMPHT .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-IEH1cciIJ9mSMPHT .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-IEH1cciIJ9mSMPHT .noteText,#mermaid-svg-IEH1cciIJ9mSMPHT .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-IEH1cciIJ9mSMPHT .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-IEH1cciIJ9mSMPHT .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-IEH1cciIJ9mSMPHT .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-IEH1cciIJ9mSMPHT .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT .section{stroke:none;opacity:0.2}#mermaid-svg-IEH1cciIJ9mSMPHT .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-IEH1cciIJ9mSMPHT .section2{fill:#fff400}#mermaid-svg-IEH1cciIJ9mSMPHT .section1,#mermaid-svg-IEH1cciIJ9mSMPHT .section3{fill:#fff;opacity:0.2}#mermaid-svg-IEH1cciIJ9mSMPHT .sectionTitle0{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .sectionTitle1{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .sectionTitle2{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .sectionTitle3{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-IEH1cciIJ9mSMPHT .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT .grid path{stroke-width:0}#mermaid-svg-IEH1cciIJ9mSMPHT .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-IEH1cciIJ9mSMPHT .task{stroke-width:2}#mermaid-svg-IEH1cciIJ9mSMPHT .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT .taskText:not([font-size]){font-size:11px}#mermaid-svg-IEH1cciIJ9mSMPHT .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-IEH1cciIJ9mSMPHT .task.clickable{cursor:pointer}#mermaid-svg-IEH1cciIJ9mSMPHT .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IEH1cciIJ9mSMPHT .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IEH1cciIJ9mSMPHT .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IEH1cciIJ9mSMPHT .taskText0,#mermaid-svg-IEH1cciIJ9mSMPHT .taskText1,#mermaid-svg-IEH1cciIJ9mSMPHT .taskText2,#mermaid-svg-IEH1cciIJ9mSMPHT .taskText3{fill:#fff}#mermaid-svg-IEH1cciIJ9mSMPHT .task0,#mermaid-svg-IEH1cciIJ9mSMPHT .task1,#mermaid-svg-IEH1cciIJ9mSMPHT .task2,#mermaid-svg-IEH1cciIJ9mSMPHT .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-IEH1cciIJ9mSMPHT .taskTextOutside0,#mermaid-svg-IEH1cciIJ9mSMPHT .taskTextOutside2{fill:#000}#mermaid-svg-IEH1cciIJ9mSMPHT .taskTextOutside1,#mermaid-svg-IEH1cciIJ9mSMPHT .taskTextOutside3{fill:#000}#mermaid-svg-IEH1cciIJ9mSMPHT .active0,#mermaid-svg-IEH1cciIJ9mSMPHT .active1,#mermaid-svg-IEH1cciIJ9mSMPHT .active2,#mermaid-svg-IEH1cciIJ9mSMPHT .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-IEH1cciIJ9mSMPHT .activeText0,#mermaid-svg-IEH1cciIJ9mSMPHT .activeText1,#mermaid-svg-IEH1cciIJ9mSMPHT .activeText2,#mermaid-svg-IEH1cciIJ9mSMPHT .activeText3{fill:#000 !important}#mermaid-svg-IEH1cciIJ9mSMPHT .done0,#mermaid-svg-IEH1cciIJ9mSMPHT .done1,#mermaid-svg-IEH1cciIJ9mSMPHT .done2,#mermaid-svg-IEH1cciIJ9mSMPHT .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-IEH1cciIJ9mSMPHT .doneText0,#mermaid-svg-IEH1cciIJ9mSMPHT .doneText1,#mermaid-svg-IEH1cciIJ9mSMPHT .doneText2,#mermaid-svg-IEH1cciIJ9mSMPHT .doneText3{fill:#000 !important}#mermaid-svg-IEH1cciIJ9mSMPHT .crit0,#mermaid-svg-IEH1cciIJ9mSMPHT .crit1,#mermaid-svg-IEH1cciIJ9mSMPHT .crit2,#mermaid-svg-IEH1cciIJ9mSMPHT .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-IEH1cciIJ9mSMPHT .activeCrit0,#mermaid-svg-IEH1cciIJ9mSMPHT .activeCrit1,#mermaid-svg-IEH1cciIJ9mSMPHT .activeCrit2,#mermaid-svg-IEH1cciIJ9mSMPHT .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-IEH1cciIJ9mSMPHT .doneCrit0,#mermaid-svg-IEH1cciIJ9mSMPHT .doneCrit1,#mermaid-svg-IEH1cciIJ9mSMPHT .doneCrit2,#mermaid-svg-IEH1cciIJ9mSMPHT .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-IEH1cciIJ9mSMPHT .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-IEH1cciIJ9mSMPHT .milestoneText{font-style:italic}#mermaid-svg-IEH1cciIJ9mSMPHT .doneCritText0,#mermaid-svg-IEH1cciIJ9mSMPHT .doneCritText1,#mermaid-svg-IEH1cciIJ9mSMPHT .doneCritText2,#mermaid-svg-IEH1cciIJ9mSMPHT .doneCritText3{fill:#000 !important}#mermaid-svg-IEH1cciIJ9mSMPHT .activeCritText0,#mermaid-svg-IEH1cciIJ9mSMPHT .activeCritText1,#mermaid-svg-IEH1cciIJ9mSMPHT .activeCritText2,#mermaid-svg-IEH1cciIJ9mSMPHT .activeCritText3{fill:#000 !important}#mermaid-svg-IEH1cciIJ9mSMPHT .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-IEH1cciIJ9mSMPHT g.classGroup text .title{font-weight:bolder}#mermaid-svg-IEH1cciIJ9mSMPHT g.clickable{cursor:pointer}#mermaid-svg-IEH1cciIJ9mSMPHT g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-IEH1cciIJ9mSMPHT g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-IEH1cciIJ9mSMPHT .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-IEH1cciIJ9mSMPHT .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-IEH1cciIJ9mSMPHT .dashed-line{stroke-dasharray:3}#mermaid-svg-IEH1cciIJ9mSMPHT #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT .commit-id,#mermaid-svg-IEH1cciIJ9mSMPHT .commit-msg,#mermaid-svg-IEH1cciIJ9mSMPHT .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-IEH1cciIJ9mSMPHT g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-IEH1cciIJ9mSMPHT g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-IEH1cciIJ9mSMPHT g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-IEH1cciIJ9mSMPHT .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-IEH1cciIJ9mSMPHT .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-IEH1cciIJ9mSMPHT .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-IEH1cciIJ9mSMPHT .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-IEH1cciIJ9mSMPHT .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-IEH1cciIJ9mSMPHT .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-IEH1cciIJ9mSMPHT .edgeLabel text{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IEH1cciIJ9mSMPHT .node circle.state-start{fill:black;stroke:black}#mermaid-svg-IEH1cciIJ9mSMPHT .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-IEH1cciIJ9mSMPHT #statediagram-barbEnd{fill:#9370db}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-state .divider{stroke:#9370db}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-IEH1cciIJ9mSMPHT .note-edge{stroke-dasharray:5}#mermaid-svg-IEH1cciIJ9mSMPHT .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-IEH1cciIJ9mSMPHT .error-icon{fill:#522}#mermaid-svg-IEH1cciIJ9mSMPHT .error-text{fill:#522;stroke:#522}#mermaid-svg-IEH1cciIJ9mSMPHT .edge-thickness-normal{stroke-width:2px}#mermaid-svg-IEH1cciIJ9mSMPHT .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-IEH1cciIJ9mSMPHT .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-IEH1cciIJ9mSMPHT .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-IEH1cciIJ9mSMPHT .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-IEH1cciIJ9mSMPHT .marker{fill:#333}#mermaid-svg-IEH1cciIJ9mSMPHT .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-IEH1cciIJ9mSMPHT {color: rgba(0, 0, 0, 0.75);font: ;}

DTMF波形合成
目 录
Contents
1.1 双音频信号表格...............
1.2 利用方波产生DTMF...........
1.3 利用数字信号源产生DTMF
DTMF检测模块
2.1 基本特性...
2.2 MT8870.......
2.3 MT8870测试
检测结果
3.1 测试代码

§01 DTMF波形合成


  之所以合成DTMF波形,主要是为了测试对于DTMF检测模块的译码性能:

  • 对于输入信号的频率适应范围;
  • 对于输入信号频率谐波适应范围;
  • 对于输入信号的幅值适应范围;
  • 对于输入信号的信噪比适应范围;

1.1 双音频信号表格

  根据 DTMF Generation and Detection 描述了DTMF的编码,在700Hz ~ 1700 Hz 范围内,分为低频组(四个频率)与高频组(四个频率)组成16个字符编码。典型的频率采集频率为8kHz。

▲ 图1.1.1 双音频的频率编码

▲ 图1.1.2 DTMF频率与编码

1.1.1 数字信号产生方法

  对于检测理论的检查,可以通过数字合成的方式来进行。下面给出了形成DTMF数字序列的公式。

  产生DTMF数字序列的公示为:

x[n]=A1sin⁡(2πf1n/fs+ϕ1)+A2sin⁡(2πf2n/fs+ϕ2)x\left[ n \right] = A_1 \sin \left( {2\pi f_1 n/f_s + \phi _1 } \right) + A_2 \sin \left( {2\pi f_2 n/f_s + \phi _2 } \right)x[n]=A1​sin(2πf1​n/fs​+ϕ1​)+A2​sin(2πf2​n/fs​+ϕ2​)

  通常情况下,取A1=A2=0,ϕ1=ϕ2=0A_1 = A_2 = 0,\,\,\phi _1 = \phi _2 = 0A1​=A2​=0,ϕ1​=ϕ2​=0
  采集信号频率: fs=8kHzf_s = 8kHzfs​=8kHz 。

1.2 利用方波产生DTMF

  对于实际DTMF检测模块,最直接的方式是通过模拟信号产生器输入到检测模块中进行检测。

  在 AN-1024 DTMF Tone Generator 给出了利用数字处理器产生两个频率的方波信号,然后通过低通滤波器滤除对应的高次谐波之后然后在进行叠加产生对应的DTMF。

  本文的第一个问题就是测量实际上使用方波进行叠加是否可以完成DTMF的发送与接收。为了实验方便,在 使用MM32 MicroPython产生双音频信号的局限性 探讨了利用MM32F3722 MicroPython 模块中的两个TImer驱动的PWM产生方波输出信号,并在 通过mem32函数来提高MM32 MicroPython 输出PWM 频率的精度 给出了提高输出频率精度的方案。下面的实验中就利用这个模块来完成测量。

1.3 利用数字信号源产生DTMF

  作为对比,可以利用实验室中的DG1062可编程信号源来产生DTMF。这个信号源具有双输出通道,因此可以产生所需要的双频率信号,并且波形可以在正弦、方波、三角波等进行选择。

§02 DTMF检测模块


2.1 基本特性

2.1.1 模块特点

  在 TB 购买带XD-61MT8870DTMF语音解码模块 ,它的特点:

  • 1、板载MT8870复频译码芯片
  • 2、板载语音输入接口
  • 3、板载5个LED指示灯,方便查看输出状态
  • 4、芯片主要管脚基本都已经引出
  • 5、PCB尺寸:26.5(mm)x24.5(mm)
  • 注:本版PCB设计时,排针引脚VCC和GND的丝印搞反了,用的时候请谨慎使用!

▲ 图2.1 MT8870DS 解码模块

  • 资料下载链接 : http://pan.baidu.com/share/link?shareid=3934643498&uk=2302102993

2.1.2 模块资料

▲ 图2.2.1 模块原理图

  在 XD-61 MT8870 DTMF Voice / Telephone Decoder Module 给出了模块的工作电压范围: 3V- 5VDC

2.2 MT8870

2.2.1 MT8870内部功能

  MT8870 是一个用于检测DTMF的单片集成芯片,内部具有两个六阶开关电容带通滤波器组成分离低频和高频信号。然后通过高增益比较器转换成方波之后进行数字信号检测译码输出。具体参见下面的内部功能框图。

▲ 图2.2.1 MT8870 内部功能框图

  下面给出了MT8870内部滤波器的幅频特性图。在350,440Hz处专门有两个滤波器的零点用于滤除拨号前摘机后音频。

▲ 图2.2.2 MT8870内部滤波器幅频特性图

2.2.2 MT8870输出逻辑以及交流特性

▲ 图2.2.3 输出信号编码表格

▲ 图2.2.4 MT8870交流特性

▲ 图2.2.5 应用电路图

▲ 图2.2.6 MT8870 运行波形图

2.3 MT8870测试

2.3.1 MM32F3277 MicroPython 模块

  MM32F3277 MicroPython 实验板 的框图:

▲ 图2.3.1 MM32F3277 MicroPython实验板

  使用它的PA6,PB6输出LOW,HIGH方波频率。

2.3.2 测试代码

from machine                import Pin,PWM
import utimefrom micropython            import const
from machine                import mem32
APB1PERIPH_BASE = const(0x40000000)
TIM3_BASE       = const(APB1PERIPH_BASE + 0x0400)
TIM4_BASE       = const(APB1PERIPH_BASE + 0x0800)
TIM_TYPE_CR1    = const(0*4)
TIM_TYPE_CR2    = const(1*4)
TIM_TYPE_SR     = const(4*4)
TIM_TYPE_CNT    = const(9*4)
TIM_TYPE_PSC    = const(10*4)
TIM_TYPE_ARR    = const(11*4)
TIM_TYPE_CCR1   = const(13*4)
TIM_TYPE_CCR2   = const(14*4)
TIM_TYPE_CCR3   = const(15*4)
TIM_TYPE_CCR4   = const(16*4)
def pwmFreq(f, pwm, duty):fosc = 96e6psc = int(fosc/f/10000) - 1arr = int(fosc/(1+psc)/f+0.5)if pwm < 4: base = TIM3_BASEelse:base = TIM4_BASEpwm -= 4mem32[base+TIM_TYPE_PSC] = pscmem32[base+TIM_TYPE_ARR] = arrccr = int(arr*duty)mem32[base+TIM_TYPE_CCR1+pwm*4] = ccrreturn arrfrom micropython   import const
APB2PERIPH_BASE = const(0x40010000)
UART1_BASE    = const(APB2PERIPH_BASE + 0x3800)
UART1_RDR     = const(UART1_BASE + 1*4)
UART1_CSR     = const(UART1_BASE + 2*4)
REPLBUF_LENGTH = const(64)
replbuf = [0]*REPLBUF_LENGTH
replpoint = 0
def procREPL(f):global replbuf,replpointif mem32[UART1_CSR] & 0x2:bc = mem32[UART1_RDR]if replpoint < REPLBUF_LENGTH-1:replbuf[replpoint] = bcreplpoint += 1if bc == 13:f(bytes(replbuf[0:replpoint-1]))replpoint = 0
def f(s):print(int(s))lfd = [697, 770, 852, 941]
hfd = [1209, 1336, 1477, 1633]lowf = PWM(0, freq=lfd[0], duty=500)
highf = PWM(4, freq=hfd[0], duty=500)pwmFreq(lfd[0], 0, 0.5)
pwmFreq(hfd[0], 4, 0.5)led = Pin('PB2', Pin.OUT_PUSHPULL)while True:led(1-led())utime.sleep_ms(100)

2.3.3 测试结果

  使用两个10k欧姆电阻将上述两个PWM输出信号叠加在一起,输入的MT8870的Pin3(IN),下面是显示的译码结果。

▲ 图2.3.2 测试结果

模块输出电压:
Q1:4.7V
Q2:0V
Q3:0V
Q4:0V
ETS:4.4V

▲ 图A2.3.3 叠加后的信号波形

(1)测量所有编码

count = 0
while True:led(1-led())utime.sleep_ms(500)count += 1if count >= 16: count = 0_ = pwmFreq(lfd[count&0x3], 0, 0.5)_ = pwmFreq(hfd[count>>2], 4, 0.5)

▲ 图2.3.3 测试所有的编码

(2)测试频偏范围

  利用PB8读取 StQ的状态,改变频率范围,测试MT8870容忍频率便宜范围。

ndim = []
listdim = list(range(-50, 50))
for n in range(-50,50):_=pwmFreq(lfd[0]+n, 0, 0.5)utime.sleep_ms(50)print(n, inp())ndim.append(inp())id1 = ndim.index(1)
id2 = ndim[id1:].index(0) + id1print(listdim[id1], listdim[id2]-1)
频率偏移允许范围:
697:±21
770:±23
852:±26
941:-28 ~ 30
1209:-35 ~ 39
1336:-35 ~ 42
1477:-41 ~ 50
1633:-44 ~ 54

2.3.4 二次谐波影响

  检测输出方波的占空比对于MT8870解码的影响。

  经过测试,对于低频当占空比在 0.32 ~ 0.67 之外的时候,MT8870无法进行识别频率了。

pwmFreq(lfd[0], 0, 0.32)
pwmFreq(hfd[0], 4, 0.5)

※ 检测结果 ※


  通过MM32F3277 MicroPython 产生的PWM 波形经过叠加之后形成DTMF,发送到MT8870D 检测模块。测试了:

  • 这种方波叠加的信号是可以被MT8870D检测到的;
  • 测试了频率允许便宜的范围;
  • 测试了方波的占空比范围;

3.1 测试代码

3.1.1 MM32F3277 MicroPython

from machine                import Pin,PWM
import utimeinp = Pin('PB8', Pin.IN_PULLUP)from micropython            import const
from machine                import mem32
APB1PERIPH_BASE = const(0x40000000)
TIM3_BASE       = const(APB1PERIPH_BASE + 0x0400)
TIM4_BASE       = const(APB1PERIPH_BASE + 0x0800)
TIM_TYPE_CR1    = const(0*4)
TIM_TYPE_CR2    = const(1*4)
TIM_TYPE_SR     = const(4*4)
TIM_TYPE_CNT    = const(9*4)
TIM_TYPE_PSC    = const(10*4)
TIM_TYPE_ARR    = const(11*4)
TIM_TYPE_CCR1   = const(13*4)
TIM_TYPE_CCR2   = const(14*4)
TIM_TYPE_CCR3   = const(15*4)
TIM_TYPE_CCR4   = const(16*4)
def pwmFreq(f, pwm, duty):fosc = 96e6psc = int(fosc/f/10000) - 1arr = int(fosc/(1+psc)/f+0.5)if pwm < 4: base = TIM3_BASEelse:base = TIM4_BASEpwm -= 4mem32[base+TIM_TYPE_PSC] = pscmem32[base+TIM_TYPE_ARR] = arrccr = int(arr*duty)mem32[base+TIM_TYPE_CCR1+pwm*4] = ccrreturn arrfrom micropython   import const
APB2PERIPH_BASE = const(0x40010000)
UART1_BASE    = const(APB2PERIPH_BASE + 0x3800)
UART1_RDR     = const(UART1_BASE + 1*4)
UART1_CSR     = const(UART1_BASE + 2*4)
REPLBUF_LENGTH = const(64)
replbuf = [0]*REPLBUF_LENGTH
replpoint = 0
def procREPL(f):global replbuf,replpointif mem32[UART1_CSR] & 0x2:bc = mem32[UART1_RDR]if replpoint < REPLBUF_LENGTH-1:replbuf[replpoint] = bcreplpoint += 1if bc == 13:f(bytes(replbuf[0:replpoint-1]))replpoint = 0
def f(s):print(int(s))lfd = [697, 770, 852, 941]
hfd = [1209, 1336, 1477, 1633]lowf = PWM(0, freq=lfd[0], duty=500)
highf = PWM(4, freq=hfd[0], duty=500)pwmFreq(lfd[0], 0, 0.5)
pwmFreq(hfd[0], 4, 0.5)led = Pin('PB2', Pin.OUT_PUSHPULL)pwmFreq(lfd[0], 0, 0.67)
pwmFreq(hfd[0], 4, 0.5)count = 0
while True:led(1-led())utime.sleep_ms(100)

■ 相关文献链接:

  • DTMF Generation and Detection
  • AN-1024 DTMF Tone Generator
  • 使用MM32 MicroPython产生双音频信号的局限性
  • 通过mem32函数来提高MM32 MicroPython 输出PWM 频率的精度
  • DG1062可编程信号源
  • TB 购买带XD-61MT8870DTMF语音解码模块
  • 资料下载链接
  • XD-61 MT8870 DTMF Voice / Telephone Decoder Module
  • MM32F3277 MicroPython 实验板

● 相关图表链接:

  • 图1.1.1 双音频的频率编码
  • 图1.1.2 DTMF频率与编码
  • 图2.1 MT8870DS 解码模块
  • 图2.2.1 模块原理图
  • 图2.2.1 MT8870 内部功能框图
  • 图2.2.2 MT8870内部滤波器幅频特性图
  • 图2.2.3 输出信号编码表格
  • 图2.2.4 MT8870交流特性
  • 图2.2.5 应用电路图
  • 图2.2.6 MT8870 运行波形图
  • 图2.3.1 MM32F3277 MicroPython实验板
  • 图2.3.2 测试结果
  • 图A2.3.3 叠加后的信号波形
  • 图2.3.3 测试所有的编码

MT8870DTMF解码器测试相关推荐

  1. 001-TensorFlow 2.0 教程-Transformer

    TensorFlow 2.0 教程-Transformer 原文地址:https://blog.csdn.net/qq_31456593/article/details/89923913 Tensor ...

  2. TensorFlow 2.0 教程25:Transformer

    这里我们将实现一个Transformer模型,将葡萄牙语翻译为英语.Transformer的核心思想是self-attention–通过关注序列不同位置的内容获取句子的表示. Transformer的 ...

  3. 以太坊源码之『RLP』

    RLP源码解析 一:概念:RLP(Recursive Length Prefix--递归长度前缀):是一个编码算法 二:功能:主要用于编码任意嵌套结构的二进制数据.是以太坊中序列和反序列化的主要方法, ...

  4. Transformer学习总结附TF2.0代码实现

    Transformer学习总结附TF2.0代码实现 Transformer 1.Transformer详解 1.1 transformer总体架构 1.2 输入部分 1.3 Multi-Head At ...

  5. TensorFlow 2 和 Keras 高级深度学习:6~10

    原文:Advanced Deep Learning with TensorFlow 2 and Keras 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文 ...

  6. 净值:测试编码器/解码器

    我最近与Netty进行了一些合作,并且按照此出色的教程中的说明构建了编码器/解码器管道,以测试编码器和解码器是否在正常工作而不必发送真实的消息. 幸运的是,有一个EmbeddedChannel确实使我 ...

  7. H.265(HEVC)解码片源测试序列,解码器下载

    测试序列:阿凡达预告片 720P: http://pan.baidu.com/share/link?shareid=447818&uk=3895737553 1080P: http://pan ...

  8. MP3 解码器精度测试

    MP3 解码器精度测试 ,集成现阶段所有解码器的精度分析. 测试结果来自MAD网站 MPEG Audio Decoder Compliance Introduction The purpose of ...

  9. 在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据

    在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据 如今,最流行的拍照设备智能手机可以捕获高达4K UHD的图像(3840×2160图像),原始数据超过25 MB.即使 ...

最新文章

  1. 解决ASP.NET网站发布问题
  2. linux电脑培训,电脑培训Linux服务器初始化Shell
  3. AtCoder Beginner Contest 178 总结
  4. 大型企业网络系统传输负载测试及分析
  5. linux shell数组参数传递参数,在bash中将数组作为参数传递
  6. 写论文和平时学习时有用的网站
  7. Star CCM+ 2206安装
  8. python爬取股票最新数据并用excel绘制树状图
  9. Ribbon负载均衡配置
  10. 电影《暮光之城》不得不爱
  11. python调用百度AI接口识别营业执照
  12. Modelsim中出现Syntax error, unexpected non-printable character错误
  13. 小程序源码整理最新的学习小程序的源码清单包含前后台
  14. python百度云活体检测_opencv-活体检测
  15. Blender着色器:使用手绘遮罩进行材质叠加
  16. Ubuntu安装Burp Suite--史上最详细教程
  17. 尝尝鲜:IDEA 使用 GitHub Copilot 插件
  18. LUNIX Anubis安装
  19. 中国互联网大厂布局元宇宙现状如何?
  20. python日历软件的制作

热门文章

  1. 创建git项目的feature分支以及下载特定分支的仓库代码
  2. 《Redis设计与实现》阅读笔记(二)--简单动态字符串
  3. [20180602]函数与标量子查询3.txt
  4. Endnote在latex中的应用的两种方法
  5. 软件工程概论课程总结
  6. 详解H3C交换机“端口安全”功能
  7. 分享一个帮助你自定义标签并且兼容现代浏览器的javascript类库 : X-tag
  8. SA区坏道数据恢复的经历
  9. MySQL自动化平台那些事-分秒必争
  10. Linux服务器上最简单的Nginx反向代理配置