机械变阻器、电位器
虽然现在有很多可以用来当做变阻器的器件:比如场效应管、X9C103数字电位器,但是由于存在非线性、寄生电容,所以在很多测量场合还是需要机械变阻器来完成。
■ 说明
在2020/9/18日,由于外部机械碰撞,使得BLUETOOTH接口断裂,整个模块就报废掉了。
▲ 拆解前的机械变阻电位器
▲ ▲ 拆解前的机械变阻电位器
01设计原理
机械变阻器
机械变阻器的控制器是由STM32F103为核心,外部使用两个A4950做起小型直流电机驱动器。通过ZIGBEE串口模块接收控制命名。
在控制上还有八个IO端口,可以通过命令任意配置成OUT,IN。
八个IO口通过左右两个相同的六管脚插座输出,从左到右分配定义为:
序号 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
1 | 3.6V | GND | BIT0 | BIT1 | BIT2 | BIT3 |
另外一个端口与画面定义相同,只是BIT的序号从4到8.
变阻器的执行部件是由带有减速齿轮箱的直流电机。直流电机配有霍尔转速吗盘。
该电机通过软塑料管可以与多圈电位器相连,通过转动带动电位器转动。
控制命令
控制命令的说明文档:
DesignCenter\MyResearch\202\机械可变电阻
控制命令在软件SerialText.C中表示:如下面代码所示:
//------------------------------------------------------------------------------
void SerialDebugProcessBuffer(void) {
SerialDebugBuffer2Argument();
if(g_ucSDANumber == 0) return;
if(strcmp("hello", (char *)STD_ARG[0]) == 0)
printf("%s is ready !\r\n", VERSION_STRING);
else IFARG0("11pwm1") {
int nNumber;
sscanf(SDA(1), "%d", &nNumber);
SetPWM1(nNumber);
}else IFARG0("11pwm2") {
int nNumber;
sscanf(SDA(1), "%d", &nNumber);
SetPWM2(nNumber);
} else IFARG0("11pwm12") {
int nNumber;
sscanf(SDA(1), "%d", &nNumber);
SetPWM12(nNumber);
} else IFARG0("varistorcount1") {
int nNumber;
sscanf(SDA(1), "%d", &nNumber);
int nPWM = 20;
if(STD_NUM > 2) {
sscanf(SDA(2), "%d", &nPWM);
if(nPWM > 50) nPWM = 50;
}
SetCount1(nNumber, nPWM);
} else IFARG0("varistorcount2") {
int nNumber;
sscanf(SDA(1), "%d", &nNumber);
int nPWM = 20;
if(STD_NUM > 2) {
sscanf(SDA(2), "%d", &nPWM);
if(nPWM >= 50) nPWM = 50;
}
SetCount2(nNumber, nPWM);
} else IFARG0("varistorsetbit") {
int nNumber;
sscanf(SDA(1), "%x", &nNumber);
SetBit((unsigned char)nNumber);
} else IFARG0("varistorclearbit") {
int nNumber;
sscanf(SDA(1), "%x", &nNumber);
ClearBit((unsigned char)nNumber);
} else IFARG0("varistorsetbitvalue") {
int nNumber;
sscanf(SDA(1), "%x", &nNumber);
SetBitValue((unsigned char)nNumber);
} else IFARG0("varistorgetstatus") {
char szString[32];
sprintf(szString, "%d %d %d\r\n", GetBitValue(), GetCount1(), GetCount2());
printf("%s", szString);
int nLength = strlen(szString);
int i;
for(i = 0; i < nLength; i ++) {
UART2SendChar(szString[i]);
}
} else IFARG0("varistorsetbitoutin"){
int nNumber;
sscanf(SDA(1), "%x", &nNumber);
SetBitOutIn((unsigned char)nNumber);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
在JPGA25DOP中带有Python调用命令程序函数,相应的命令见下面的代码:
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# JPGA25.PY -- by Dr. ZhuoQing 2020-01-26
#
# Note:
#============================================================
from head import *
from tsmodule.tshardware import *
def jpgasetbitoutin(bit):
ccloadSerial.write(b'varistorsetbitoutin %x\r'%bit)
def jpgagetstatus():
if ccloadSerial.inWaiting() > 0:
ccloadSerial.read(ccloadSerial.inWaiting())
ccloadSerial.write(b'varistorgetstatus\r')
for i in range(100):
if ccloadSerial.inWaiting() > 0: break
time.sleep(0.01)
time.sleep(0.01)
return ccloadSerial.read(ccloadSerial.inWaiting())
def jpgasetbitvalue(bit):
ccloadSerial.write(b'varistorsetbitvalue %x\r'%bit)
def jpgarun1(step, speed=20):
ccloadSerial.write(b'varistorcount1 %d %d\r'%(step, speed))
def jpgarun2(step, speed=20):
ccloadSerial.write(b'varistorcount2 %d %d\r'%(step, speed))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
测试结果
通过以下代码,使得变阻器变动,通过DM3068数字万用表测量电阻。
变阻器的引脚三个,从右到左,分别是滑动端,固定端1,固定端2.
指令中,如果RUN的参数为正,则滑动端与固定端2的电阻减少,与固定端1的电阻增加。
移动总步数大约为4500。
由于使用ZIGBEE进行命令控制,其中会出现丢失命令数据包的情况,所以在移动过程中电阻的变化会出现暂留的情况。
下面是对于第二个电阻测试的结果。每移动一次,测量滑动端至固定端2 之间的电阻。
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# EXE1.PY -- by Dr. ZhuoQing 2020-01-26
#
# Note:
#============================================================
from headm import *
from tsmodule.tsvisa import *
dm3068open()
from jpga25 import *
#------------------------------------------------------------
jpgarun2(5500, 50)
#exit()
time.sleep(2)
#------------------------------------------------------------
resdim = []
pltgif = PlotGIF()
for i in range(80):
jpgarun2(-50, 20)
time.sleep(.5)
res = dm3068res()
printff(i, res)
resdim.append(res)
plt.clf()
plt.plot(resdim)
plt.xlabel('Sample')
plt.ylabel('Resistor(ohm)')
plt.pause(.01)
pltgif.append(plt)
pltgif.save(r'd:\temp\res.gif', 50, 3000)
jpgarun2(5500, 50)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/104089780
- 点赞
- 收藏
- 关注作者
评论(0)