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