在这个项目中,我们将为arduino接口一个数字电位器。在本演示电位器MCP41010使用,但您可以使用任何数字电位器的MC41**系列。
由Ankit Negi
介绍MC41010
数字电位器就像任何模拟电位器一样,有三个终端,只有一个差异。而在模拟电位器中,你必须手动改变雨刷的位置,而在数字电位器中,雨刷的位置是根据使用任何微控制器或微处理器给电位器的信号设置的。
图MC41010 IC引脚
MC41010是一款8引脚双in line封装IC,就像任何模拟电位器一样,该IC有5k, 10k, 50k和100k。在这个电路中使用了10k电位计
MC4131有以下8个端子:
销不。小说明
1 CS此引脚用于选择连接到arduino的从端或外设。如果这是
低则选择MC41010,如果是高则取消选择MC41010。
2 SCLK共享/串行时钟,arduino给出时钟初始化的数据传输
Arduino到IC,反之亦然。
3 SDI/SDO arduino和IC之间的串行数据通过该引脚传输
4 VSS arduino的接地端子接在IC的这个引脚上。
这是电位器的一个端子。
6 PW0这个端子是电位器的雨刷端子(改变电阻)
这是电位器的另一个端子。
8 VCC IC的电源通过这个引脚。
这种集成电路只包含一个电位器。有些集成电路内最多有两个电位器。这
雨刷和任何其他端子之间的电阻值在256步内改变,从0到255。由于我们使用的是10k电阻器,电阻器的值是按以下步骤改变的:
10k/256= 39欧姆每步之间的0和255
组件
我们需要以下组件为这个项目。
1.ARDUINO
2.MC41010集成电路
3.220欧姆电阻
4.领导
5.连接电线
如图所示进行连接。
1.连接cs引脚到数字引脚10。
2.连接SCK引脚到数字引脚13。
3.连接SDI/SDO引脚到数字引脚11。
4.VSS到arduino接地引脚
5.arduino的PA0到5v引脚
6.arduino的PB0接地
7.PWO到arduino的模拟引脚A0。
8.VCC到5v arduino。
程序代码1
此代码在Arduino IDE的串行监视器上打印雨刷端子和地面的电压变化。
# include < SPI.h >
int CS = 10;//将变量CS引脚初始化为arduino的引脚10
int x;//初始化变量x
浮动电压;//初始化可变电压
int我;//这是在步骤中改变的变量,因此改变相应的电阻。
无效的设置()
{
pinMode (CS, OUTPUT);//初始化10引脚作为输出引脚
pinMode (A0, INPUT);//初始化引脚A0作为输入引脚
SPI.begin ();//启动串行外设接口
Serial.begin (9600);//开始arduino和ic之间的串行通信。
}
无效循环()
{
For (int I = 0;< = 255;I ++)//这个运行循环从0到255步,每步之间10毫秒的延迟
{
digitalPotWrite(我);//将I级写入IC,决定IC的电阻
延迟(10);
x = analoggread (A0);//从引脚A0读取模拟值
电压= (x * 5.0)/ 1024.0;//将模拟值转换为相应的电压等级
系列。print("Level i = ");//这些串行命令在雨刷上打印I或电平和电压的值
并同时(我);//和gnd在arduino IDE的串行监视器上
系列。print("\t电压= ");
以电压,3);
}
延迟(500);
For (int I = 255;我> = 0;//这个运行循环从255到0步,每一步之间有10毫秒的延迟
{
digitalPotWrite(我);
延迟(10);
x = analoggread (A0);
电压= (x * 5.0)/ 1024.0;//将模拟值转换为相应的电压电平
系列。print("Level i = ");//这些串行命令在雨刷上打印I或电平和电压的值
并同时(我);//和gnd在arduino IDE的串行监视器上
系列。print("\t电压= ");
以电压,3);
}
}
int digitalPotWrite(int value) //该块在编码部分解释
{
digitalWrite (CS、低);
SPI.transfer (B00010001);
SPI.transfer(价值);
digitalWrite (CS、高);
解释代码1:
要使用arduino数字电位器,您需要包括SPI库首先提供arduino IDE本身。只需使用以下命令调用库:
# include < SPI.h >
在空设置中,引脚被指定为输出或输入。并给出了arduino和ic之间的SPI和串行通信的开始命令:
SPI.begin ();和Serial.begin (9600);
在空回路中,用for回路来改变数字壶的电阻,共256步。首先从0到255,然后再回到0,每一步之间有10毫秒的延迟:
For (int I = 0;< = 255;for (int I = 255;我> = 0;我——)
digitalPotWrite(i)函数通过写入这些值来改变ic特定地址的电阻。
刮水器和终端之间的电阻可以用以下公式计算:
R1= 10k*(256-level)/256 + Rw
和
R2= 10k*level/256 + Rw
这里R1=雨刷和一个终端之间的电阻
R2=雨刷与其他端子之间的电阻
Level =特定时刻的步长(for循环中使用的变量“I”)
Rw=雨刷端电阻(可在ic数据表中找到)
利用digitalPotWrite()函数,通过给CS引脚分配低电压来选择数字电位器芯片。现在,当ic被选择,一个地址必须被调用,数据将被写入。在代码的最后部分:
SPI.transfer (B00010001);
地址被称为B00010001,以选择要在其上写入数据的ic的雨刷终端。因此,for循环的值,也就是i,被写入来改变电阻。
电路工作:
只要i的值不断变化,arduino的A0引脚的输入也会在0到1023之间不断变化。这是因为雨刷端直接接A0引脚,电位器的其他端分别接5伏和地。当电阻发生变化时,通过它的电压也发生变化,arduino直接将其作为输入,因此我们在串行监视器上得到一个特定电阻值的电压值。
模拟1:
下面是该电路在不同i值下的仿真图:
现在将一个220欧姆电阻的led串联到IC的雨刷端,如图所示。
代码2:
# include < SPI.h >
int CS = 10;
int x;
浮动电压;
int我;
无效的设置()
{
pinMode (CS, OUTPUT);
pinMode (A0、输入);
//启动串行外设接口
}
无效循环()
{
For (int I = 0;< = 255;I ++)//这个运行循环从0到255步,每步之间10毫秒的延迟
{
digitalPotWrite(i);//将i级写入ic,决定ic的电阻
延迟(10);
}
延迟(500);
For (int I = 255;我> = 0;//这个运行循环从255到0步,每一步之间有10毫秒的延迟
{
digitalPotWrite(我);
延迟(10);
}
}
int digitalPotWrite(int value)//该块在编码部分解释
{
digitalWrite (CS、低);
SPI.transfer (B00010001);
SPI.transfer(价值);
digitalWrite (CS、高);
}
解释代码2:
这段代码与代码1相似,只是在这段代码中没有串行命令。所以没有值将打印在串行监视器上。
解释工作
由于引线连接在雨刷端子和地之间,当电阻变化时,引线两端的电压也变化。因此,当连接led的电阻从0欧姆上升到最大时,led的亮度也随之上升。由于电阻从最大值减小到0v,它再次缓慢地消失。
Simulation2
Simulation3
先生,有没有集成电路或便宜的电路具有时钟计时功能?那东西应该有以下特点…不间断的计时系统像手表am PM一切,可编程的一个或多个输出,给信号在完美的预定义tym由我。
我不想要555timer这样的IC,我想要watch clock这样的计时电路。
我希望你得到了我想要的。
Gurmel,你可以使用IC 4060并配置一个晶体,这将使IC与精确的时钟振荡。