虽然有很多器件可以用作变阻器:如场效应晶体管、X9C103数字电位器,但由于非线性和寄生电容的存在,许多测量场合仍然需要机械变阻器。
说明
2020年9月18日,由于外部机械碰撞,BLUETOOTH接口断裂,整个模块报废。
机械变阻电位器拆解前
01设计原理
机械变阻器
机械变阻器的控制器以STM32F103为核心,外部使用两片A4950制作小型直流电机驱动器。通过ZIGBEE串口模块接收控件命名。
控制器上还有8个IO口,可以通过命令配置为OUT或IN。
8个IO口通过左右两个相同的六针插座输出,从左到右的分配定义为:
另一个端口的定义与屏幕相同,只是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 已准备就绪!\r\n', VERSION_STRING);否则IFARG0('11pwm1') { int nNumber; sscanf(SDA(1), '%d', nNumber);设置PWM1(nNumber); }else IFARG0('11pwm2') { int nNumber; sscanf(SDA(1), '%d', nNumber);设置PWM2(nNumber); } else IFARG0('11pwm12') { int nNumber; sscanf(SDA(1), '%d', nNumber);设置PWM12(nNumber); } else IFARG0('varistorcount1') { int nNumber; sscanf(SDA(1), '%d', nNumber);整数nPWM=20; if(STD_NUM 2) { sscanf(SDA(2), '%d', nPWM) ;如果(nPWM 50)nPWM=50; } SetCount1(nNumber, nPWM); } else IFARG0('varistorcount2') { int nNumber; sscanf(SDA(1), '%d', nNumber);整数nPWM=20; if(STD_NUM 2) { sscanf(SDA(2), '%d', nPWM);如果(nPWM=50)nPWM=50; } SetCount2(nNumber, nPWM); } else IFARG0('varistorsetbit') { int nNumber ; sscanf(SDA(1), '%x', nNumber); SetBit((无符号字符)nNumber); } else IFARG0('varistorclearbit') { int nNumber; sscanf(SDA(1), '%x', nNumber ); ClearBit((无符号字符)nNumber); } else IFARG0('varistorsetbitvalue') { int nNumber; sscanf(SDA(1), '%x', nNumber); SetBitValue((无符号字符)nNumber); } else IFARG0 ('varistorgetstatus') { char szString[32]; sprintf(szString, '%d %d %d\r\n', GetBitValue(), GetCount1(), GetCount2()); printf('%s', szString ); int nLength=strlen(szString);整数我; for(i=0; i nLength; i ++) { UART2SendChar(szString[i]); } } else IFARG0('varistorsetbitoutin'){ int nNumber; sscanf( SDA(1), '%x', nNumber); SetBitOutIn((无符号字符)nNumber); JPGA25DOP中有Python调用命令程序功能。对应的命令见下面的代码:
#!/usr/local/bin/python# -*-coding: gbk -*-#================================================================# JPGA25.PY -- by 卓庆博士2020-01-26## Note: #=============================================================from head import *from tsmodule.tshardware import *def jpgasetbitoutin(bit): ccloadSerial.write(b'varistorsetbitoutin %x\r'%bit)def jpgagetstatus(): 如果ccloadSerial.write(b'varistorsetbitoutin %x\r'%bit)def jpgagetstatus(): inWaiting( ) 0: ccloadSerial.read(ccloadSerial.inWaiting()) ccloadSerial.write(b'varistorgetstatus\r') for i in range(100): if ccloadSerial.inWaiting() 0: 中断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)) 测试结果
通过以下代码,改变变阻器,通过DM3068数字万用表测量阻值。压敏电阻共有三个引脚,从右到左分别是滑动端、固定端1、固定端2。
指令中,若RUN参数为正,则滑动端与固定端2之间的电阻减小,滑动端与固定端1之间的电阻增大。总移动步数约为4500步。
由于使用ZIGBEE进行命令控制,命令数据包可能会丢失,因此在运动过程中电阻可能会持续变化。
以下是第二次电阻测试的结果。每次移动时,测量滑动端与固定端2之间的阻力。
#!/usr/local/bin/python# -*-coding: gbk -*-#==================================================================# EXE1.PY -- by 卓庆博士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('样品') plt.ylabel('电阻器(欧姆)') plt.暂停(.01) pltgif .append(plt)pltgif.save(r'd:\temp\res.gif', 50, 3000)jpgarun2(5500, 50)编辑器: hfy