AD\Test\2024\December\VOICESTC8G1K17SERVO.PcbDoc
C51\STC\Test\2024\December\TestSTC8G1K17\TestSTC8G1K17.uvproj

 

01 机控制


一、前言

  手边有一个语音台灯电路,  下面准备通过使用一个单片机, 读取语音台灯上LED端口电压的变化,  从而控制外部的一个舵机, 实现语音对舵机的控制。

G3M1735387743_1920_1080.MP4|_-3

二、电路设计

  首先设计简单的测试电路,  铺设单面PCB,  一分钟之后得到测试电路板。  电路板非常完美。  下面进行焊接测试。

G5M1735364253_1920_1080.MP4|_-5
  焊接测试电路。  清洗之后进行调试。

G2M1735365728_1920_1080.MP4|_-2
  编写ADC子程序。 在ADC0 输入端口并联一个 10微法的电容。 通过串口将采集到的256个数据发送出来。  读取这些数据, 绘制出数据波形, 与信号源所产生的信号是一致的。

G2M1735366979_1920_1080.MP4|_-2

▲ 图1.2.1 采集到的ADC中的信号

▲ 图1.2.1 采集到的ADC中的信号

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2024-12-28
#
# Note:
#============================================================
from headm import *
from tsmodule.tsstm32       import *
#------------------------------------------------------------
ispclearreceive()
ispsend("adc")
time.sleep(5)
#------------------------------------------------------------
ispcopyreceive()
strall = clipboard.paste().split("\r\n")
sdim = ''.join([s for s in strall if len(s) > 20])
sdata = [int(s) for s in sdim.split(' ') if len(s) > 0]
plt.plot(sdata, lw=3)
plt.xlabel("N", color="steelblue", fontsize=16)
plt.ylabel("ADC", color="steelblue", fontsize=16)
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

  将信号修改为三角波。  ADC的数据符合 10 位ADC采集到的信号幅度。
G2M1735367080_1920_1080.MP4|_-2

▲ 图1.2.2 信号修改为 三角波的波形

▲ 图1.2.2 信号修改为 三角波的波形

三、产生PWM波形

  在 8G 单片机中, 没有PWM定时器。  利用TIMER2 中断产生 舵机所需要的控制脉冲。  在 TIMER2 20微秒的中断中, 使用一个计数器, 可以对 20ms 进行定时。  然后对比 计数器是否超过某个阈值,  从控制 T0输出高电平的时间。  这是T0端口输出的脉冲, 在1ms 和 2ms 之间切换, 从而控制舵机的转动。

G6M1735373472_1920_1080.MP4|_-6

//==============================================================================
#if TIME2_INT_EN
//------------------------------------------------------------------------------
void Timer2Init(void) {
    AUXR |= 0x04;		
    T2L = 0x44;		
    T2H = 0xFD;		
    IE2 |= 0x4;                         // 7:ETKSU1 6:ET4: 5:ET3: 4:ES4: 3:ES3, 2:ET2, 1:ESPI, 0:ES2
    AUXR |= 0x10;		

    //--------------------------------------------------------------------------
    g_nTimer2IntCount = 0;    
    
}

void Timer2ISR(void) interrupt 12 using 1 {
    g_nTimer2IntCount ++;

    if(g_nTimer2IntCount >= TIME2_PERIOD) {
        g_nTimer2IntCount = 0;
    }
    
    if(g_nTimer2IntCount < g_nPWMOut) ON(T0_PIN);
    else OFF(T0_PIN);
}

#endif // TIME2_INT_EN

  将舵机接入端口,  可以看到它的输出轴能够摆动。  下面将它的输出轴延长,  便可以按动机械开关。  接下来, 将语音控制灯与电路板连接起来。

G5M1735374276_1920_1080.MP4|_-5

/*
**==============================================================================
** MAIN.C:             -- by Dr. ZhuoQing, 2020-04-15
**
**==============================================================================
*/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void main(void) {
    unsigned int nCount;
    unsigned int nShowCount;
    unsigned int nFlag;
    unsigned int nSecondCount;
    //--------------------------------------------------------------------------
    STC8GInit();    
    //--------------------------------------------------------------------------
    WaitTime(200);
    MainInit();
    print("STC8G08 -- by Dr. ZhuoQing,%s,%s\r\n", "\n",  __DATE__, "\n",  __TIME__);   
    SerialTxtInit();
    //--------------------------------------------------------------------------
    ADCSetChannel(0);
    //--------------------------------------------------------------------------    
    nCount = 0;
    nShowCount = 0;
    //--------------------------------------------------------------------------
    nFlag = 0;
    nSecondCount = 0;
    //--------------------------------------------------------------------------
    for(;;) {
        WaitTime(1);
        //----------------------------------------------------------------------
        if(nSecondCount > 0) {
            nSecondCount --;
            if(++nCount & 0x10) ON(LED);        
            else OFF(LED);
        } else {
            g_nPWMOut = PWM_1_5MS;
            if(++nCount & 0x100) ON(LED);        
            else OFF(LED);
        }
        //----------------------------------------------------------------------
        if(++nShowCount >= 250) {
            nShowCount = 0;
            if(ADCConvert() > 650) {
                if(nFlag == 0) {
                    g_nPWMOut = PWM_2MS;   
                    nSecondCount = 1000;
                }
                nFlag = 1;
            } else {
                if(nFlag == 1) {
                    g_nPWMOut = PWM_1MS;
                    nSecondCount = 1000;
                }
                nFlag = 0;
            }
            print("ADC:%d\r\n", "\n",  ADCConvert());                
        }
        //----------------------------------------------------------------------
        ConsoleDebug();
    }
}
//------------------------------------------------------------------------------
void MainInit(void) {
    PM_PP(LED);
    PM_PP(T0_PIN);
    OFF(T0_PIN);
    g_nPWMOut = 75;
}
//==============================================================================
//                END OF THE FILE : MAIN.C
//------------------------------------------------------------------------------

四、连接语音芯片

  这是刚才制作的语音电路板。  其中的 AI329C是从一个语音台灯中拆卸下来的。  现在可以通过语音来控制舵机的动作。 STC8G1K17单片机读取语音板上LED两端电压的变化,  进而控制舵机的动作。  基于这个电路板可以通过语音来控制墙面上的机械开关。

G5M1735387577_1920_1080.MP4|_-5

 

  结 ※


  文记录了语音控制舵机的可成。  在制作过程中, 由于原来的语音电路板断裂, 后来将上面的芯片拆卸下来,  然后仿照原来的电路制作的替代的模块。

G3M1735387672_1920_1080.MP4|_-3


■ 相关文献链接:

● 相关图表链接:

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。