机械变阻器、电位器

举报
tsinghuazhuoqing 发表于 2021/12/25 23:28:07 2021/12/25
【摘要】   虽然现在有很多可以用来当做变阻器的器件:比如场效应管、X9C103数字电位器,但是由于存在非线性、寄生电容,所以在很多测量场合还是需要机械变阻器来完成。   ■ 说明   在202...

  虽然现在有很多可以用来当做变阻器的器件:比如场效应管、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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。