机械变阻器电位器

网友投稿 562 2022-05-29

虽然现在有很多可以用来当做变阻器的器件:比如场效应管、X9C103数字电位器,但是由于存在非线性、寄生电容,所以在很多测量场合还是需要机械变阻器来完成。

■ 说明

在2020/9/18日,由于外部机械碰撞,使得BLUETOOTH接口断裂,整个模块就报废掉了。

01

设计原理

机械变阻器

机械变阻器的控制器是由STM32F103为核心,外部使用两个A4950做起小型直流电机驱动器。通过ZIGBEE串口模块接收控制命名。

在控制上还有八个IO端口,可以通过命令任意配置成OUT,IN。

八个IO口通过左右两个相同的六管脚插座输出,从左到右分配定义为:

另外一个端口与画面定义相同,只是BIT的序号从4到8.

变阻器的执行部件是由带有减速齿轮箱的直流电机。直流电机配有霍尔转速吗盘。

该电机通过软塑料管可以与多圈电位器相连,通过转动带动电位器转动。

控制命令

控制命令的说明文档:

DesignCenter\MyResearch2\机械可变电阻

控制命令在软件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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java原型模式
下一篇:Servlet从了解到放弃(05)
相关文章