机械变阻器电位器

网友投稿 553 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)
相关文章