单片机STC8G1K17的输出PWM, 连接语音芯片
这是T0端口输出的脉冲, 在1ms 和 2ms 之间切换,从而控制舵机的转动。STC8G1K17单片机读取语音板上LED两端电压的变化, 进而控制舵机的动作。读取这些数据, 绘制出数据波形, 与信号源所产生的信号是一致的。手边有一个语音台灯电路, 下面准备通过使用一个单片机, 读取语音台灯上LED端口电压的变化, 从而控制外部的一个舵机, 实现语音对舵机的控制。在制作过程中, 由于原来的语音电
AD\Test\2024\December\VOICESTC8G1K17SERVO.PcbDoc
C51\STC\Test\2024\December\TestSTC8G1K17\TestSTC8G1K17.uvproj
01 舵机控制
一、前言
手边有一个语音台灯电路, 下面准备通过使用一个单片机, 读取语音台灯上LED端口电压的变化, 从而控制外部的一个舵机, 实现语音对舵机的控制。

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

焊接测试电路。 清洗之后进行调试。

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


▲ 图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采集到的信号幅度。![]()

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

//==============================================================================
#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
将舵机接入端口, 可以看到它的输出轴能够摆动。 下面将它的输出轴延长, 便可以按动机械开关。 接下来, 将语音控制灯与电路板连接起来。

/*
**==============================================================================
** 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两端电压的变化, 进而控制舵机的动作。 基于这个电路板可以通过语音来控制墙面上的机械开关。

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

■ 相关文献链接:
● 相关图表链接:
所有评论(0)