程控电阻器原理及应用详解

程控电阻器

        由于要测试电阻型温度传感器,一个电阻箱又很贵,就想做一款 程控电阻器 来满足。

        设计满足300Ω到400kΩ可调电阻。


设计思路

        选择数字电位器去控制电阻输出,最好是精度高,范围大的数字电位器。经过寻找后,发现AD8403比较满足需求。采用STM32F103C8T6作为主控芯片。

AD8403

        AD8400/AD8402/AD8403分别是单通道/双通道/四通道、256位、数字控制可变电阻(VR)器件1,可实现与机械电位计或可变电阻相同的电子调整功能。AD8400内置一个可变电阻,采用紧凑的SOIC-8封装。AD8402内置两个独立的可变电阻,采用节省空间的SOIC-14表面贴装封装。AD8403内置四个独立的可变电阻,提供24引脚PDIP、SOIC和TSSOP三种封装。各器件均内置一个带游标触点的固定电阻,该游标触点在载入控制串行输入寄存器的数字码所确定的数字码分接该固定电阻值。游标与固定电阻任一端点之间的电阻值,随传输至VR锁存器中的数字码呈线性变化。在A端与游标或B端与游标之间,各可变电阻提供一个完全可编程电阻值。A至B固定端接电阻(1 kΩ、10 kΩ、50 kΩ或100 kΩ)的通道间匹配容差为±1%,标称温度系数为500 ppm/°C。

想法

        AD8403为四通道数字电位器,每个通道可分为256份,要想范围大。就要选择一片大的100K的。但是这样的话精度就只有100000/256=390欧。四通道串联范围可以达到400k,但是精度不符合我们的需求,在选择一片1K的AD8403,精度为1000/256=4欧,这样精度可以达到4欧,如果我们将1k的两两并联,这样并联之后每组可以达到500欧,正好包含了400欧,精度也达到了2欧,再通过串联将这两个和前边的100k的串联起来,这样的话就可以从0到400k欧范围,然后精度可以达到2欧(如果四个并联的话精度达到了1欧,但是范围只有250欧了,包含不了400欧,即有覆盖不到的地方)。这样就比较完美了。AD8403为了保护器件,就算输出0。器件也会有大约50欧的电阻。100k的和1k的会差一点,实测的话这样串并零最少也会有300欧。如果我们在1k的满足输出的时候。将100k的短路的话就可以得到更小的阻值。所以在1k串并零得到最大值之前,使用继电器将100k短路掉。

设计过程。

材料

  • STM32F103C8T6主控芯片
  • AD8403ARUZ1
  • AD8403ARUZ100
  • HFD4-3直插继电器
  • 贴片按键
  • 0.96寸OLED显示屏
  • Type-C
  • 1117电源芯片
  • 电阻电容晶振等。
  • 原理图

            通过嘉立创绘制。

    PCB

            通过嘉立创绘制。

    程序

    Keil 5编写。放上关键代码。
    控制代码。

    
    				if(R_Zuzhi < 300)
    					R_Zuzhi = 300;
    				if(R_Zuzhi > 400000)
    					R_Zuzhi = 400000;
    				testShowFont(&u8g2,R_Zuzhi);
            /* 1616欧	本身有70欧  每1是3欧 还剩 1561欧 一半962欧*/
            if(R_Zuzhi < 1360)
            {
                JDQ = 1;
    						K1_5 = R_Zuzhi;
            }
            else
            {
    						JDQ = 0;
    						K2_Set = (R_Zuzhi -  Offset) / 398; 
    					
    						if(K2_Set > 1020)
    						{
    							Set1 = 255;
    							Set2 = 255;
    							Set3 = 255;
    							Set4 = 255;
    							if(K2_Set > 1023)
    							{
    								Set5 = 255;
    								Set7 = 255;
    							}
    							else
    							{
    								K1_5 = R_Zuzhi - (1020 * Jingdu) - Offset;
    							}
    						}
    						else if(K2_Set > 765)
    						{
    							Set1 = 255;
    							Set2 = 255;
    							Set3 = 255;
    							Set4 = K2_Set - 765;
    							K1_5 = R_Zuzhi - (K2_Set * Jingdu) - Offset;
    						}
    						else if(K2_Set > 510)
    						{
    							Set1 = 255;
    							Set2 = 255;
    							Set3 = K2_Set - 510;
    							Set4 = 0;
    							K1_5 = R_Zuzhi - (K2_Set * Jingdu) - Offset;
    						}
    						else if(K2_Set > 255)
    						{
    							Set1 = 255;
    							Set2 = K2_Set - 255;
    							Set3 = 0;
    							Set4 = 0;
    							K1_5 = R_Zuzhi - (K2_Set * Jingdu) - Offset;
    						}
    						else
    						{
    							Set2 = K2_Set;
    							Set1 = 0;
    							Set3 = 0;
    							Set4 = 0;
    							K1_5 = R_Zuzhi - (K2_Set * Jingdu) - Offset;
    						}
    					
            }
    
    				K1_Set = (K1_5 - 56) / 2.56;
    				if(K1_Set > 255)
    				{
    					Set5 = 255;
    					Set7 = K1_Set - Set5;
    				}
    				else
    				{
    					Set7 = 0;
    					Set5 = K1_Set;
    				}
    				
    //            Set10 = Set9;
    				AD8403_W(0, Set1); //100k短接 100k还有283欧电阻  共333欧
    				AD8403_W(1, Set2);
    				AD8403_W(2, Set3);
    				AD8403_W(3, Set4);
    				AD84032_W(0, Set5); //100k短接 1k还有55欧电阻
    				AD84032_W(1, Set5);
    				AD84032_W(2, Set7);
    				AD84032_W(3, Set7);
    //				SHDN=0;//为0时,所有? 缱鐰端开路,W连接到B,关闭SDO输出晶体管
    	 
    

    AD8403驱动

    
    void AD8403_W(int CH, int w)
    {
        int i = 0;
        int channal = CH;
        int send_data = w;
        CS = 0;
        delay_us(10);
        //前两个bit  选通道
        for(i = 0; i < 2; i ++)            //send the channal index
        {
            if((channal & 0x02) == 0x02)
                SDI = 1;
            else
                SDI = 0;
            delay_us(1);
            CLK = 1;           //Set SPI_SCK to High voltage
            delay_us(1);
            CLK = 0;          //Set SPI_SCK to low voltage
            channal = channal << 1;
        }
        //后八个bit  指定阻值
        for(i = 0; i < 8; i ++)            //send the resister value
        {
            if((send_data & 0x80) == 0x80)
                SDI = 1;
            else
                SDI = 0;
            delay_us(1);
            CLK = 1;           //Set SPI_SCK to High voltage
            delay_us(1);
            CLK = 0;          //Set SPI_SCK to low voltage
            send_data = send_data << 1;
        }
        CS = 1;
    }
    

    实物展示

    正面图

    反面图

    视频演示

    程控电阻器演示

    总结

    虽然范围大,但是精度还是控制的不理想。可能是芯片问题。控制之后,电阻会抖动和飘移,但是总体还是实现了相应的功能。可以使用。

    作者:释博文

    物联沃分享整理
    物联沃-IOTWORD物联网 » 程控电阻器原理及应用详解

    发表回复