使用MCP41010搭建可变增益放大电路(采用SPI与模拟SPI通讯)

本文介绍了MCP41010芯片的使用,特别是通过SPI总线进行数据写入操作,控制内部电位计,以及在实验中遇到的问题和解决方法。作者展示了如何配置单片机的SPI模块进行通信,并讨论了实验结果与理论值的差异。
摘要由CSDN通过智能技术生成

MCP41010芯片介绍

MCP41010芯片封装图

1号脚,片选信号角,在上电以后,该引脚上施加低电平时才可以对芯片内部数据进行写入

2号脚,时钟信号脚,在对芯片进行数据写入时,需要给其提供时钟信号,例如在本次实验中写入数据时就要在该引脚上产生16个连续的脉冲。

3号脚,数据脚,这个引脚会接收控制器发出的串行信号。

4号脚,GND,这个引脚用来接地。

8号脚,Vdd,这个引脚用来接电源线,根据其数据手册可以提供2.7V到5.5V的电压。

5、6、7号脚,时芯片内部的电位计。

在这个电位计上有256(2^8)个抽头位置,PW0的具体位置将由写入的数据决定。当写入数据为0,PW0将移动到PB0的位置,若写入255则PW0将移动到PA0的位置。

控制器向芯片写入数据时要发送两个字节的串行数据,其中第一个字节用来选择工作状态,其中只有C1、C0、P1、P0这四位需要关注。

根据数据手册的内容,本实验使用写入数据操控Potentiometer0,所以向芯片发送的第一个字节的数据为00010001。

还有两个需要注意的点是,在对芯片进行数据写入时需要对片选信号置于低电平且在数据传输结束以后,需要将片选信号拉高。MCP41010芯片对数据线的信号采样发生在SCK的上升沿。

SPI总线通讯

SPI 是由摩托罗拉(Motorola)公司开发的全双工同步串行总线,是微处理控制单元(MCU)和外围设备之间进行通信的同步串行端口。主要应用在EEPROM、Flash、实时时钟(RTC)、数模转换器(ADC)、网络控制器、MCU、数字信号处理器(DSP)以及数字信号解码器之间。SPI 系统可直接与各个厂家生产的多种标准外围器件直接接口,一般使用4 条线:串行时钟线SCK、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI 和低电平有效的从机选择线SSEL。

SPI多数情况下用做在主机与从机之间的通讯,本实验中则利用单片机中的SPI模块对MCP41010芯片进行数据写入。

在本实验使用的单片机中有以下寄存器与SPI通讯的设置相关

SPCTL是SPI控制寄存器,其中最高位SSIG用来控制单片机引脚的工作状态,确定该单片机为从机还是主机。SPEN是使能位,只有改为为1时才会使得单片机工作在SPI的模式下。

DORD用来设置数据发送的顺序(1,LSD(最低位)先发送,0,MSB(最高位)先发送)。CPOL用来控制输出的时钟端空闲时的高低电平。CPHA用来选择数据与时钟的配合模式。

本人在实验中选取了CPOL=1;CPHA=0的工作方式,下图为该工作方式下产生的脉冲,红色箭头为采样的位置。

最后两位SPR1与SPR0则是用于选择SPI时钟的速率(可以类比于设置51系列串行通讯的bode率)

SPSTAT寄存器是用于描述SPI通讯的,其中SPIF为通讯结束的标志位,当一次通讯结束后SPIF会置1,需要软件对其进行清0(类比于51单片机串行通讯的标志位TI)WCOL位为写冲突。

SPDAT寄存器用于存放将要进行SPI通讯的数据,在控制寄存器允许的情况下,写入SPDAT以后就会进行通讯(就好比51中的SBUF)

AUXR1寄存器可以将默认的P1口实现SPI功能移动到P4口上;由于本实验中没有使用到该寄存器不作介绍。(不过该寄存器中ADRJ位是设置10位AD转换后数据存放模式的一位在实验4中会用到)

下图为数据手册提供的工作模式选择表

本实验中选择了最下面这一列的工作模式

电路设计图

IO口模拟SPI代码

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit  CS=P1^4;

sbit SCLK=P1^7;

sbit MOSI=P1^5;

uchar num1[8]={0,0,0,1,0,0,0,1}; //0X11

uchar num3[8]={0,1,0,0,1,1,0,0}; //0x4C

uchar num8[8]={1,1,0,0,1,1,0,0}; //0XCC

uchar count,flag;

void send(uchar num[8]);

void delay(uchar j) //延时函数

{

       uchar i;

       i=125;

       for(;j>0;j--)

       {

       while(i--)

       {

              ;

       }

}

}

void main()    

{

      

       TR0=0;

       TMOD=0x01; //设置定时器为方式1 16位 并且工作于计时状态

       TH0=0x3c;  //目标间隔5秒,晶振位4M,一个机器周期3us

                   //让定时器计时0.15s再由i计数33次

                    //(2^16-50000)为TH0与TL0中值

       TL0=0xb0;

       EA=1;   //开总中断

       ET0=1;   //开定时器T0中断

       count=33;

       while(1)

{

       flag=1;

       send(num3);

       TR0=1;

       while(flag); //while(flag)用来等待计时满5s

                //计时满5s以后会将flag=0,并且关闭定时器

      

       flag=1;

       send(num8);

       TR0=1;

       while(flag);

      

}

}

void timer0() interrupt 1 //中断函数因为使用定时器T0

                               //所以中断号为1

{

       TH0=0x3c;

       TL0=0xb0;

       count--;

       if(count<=0)

       {

              flag=0;

              count=33;

              TR0=0;

       }

}

void send(uchar num[8]) //用来产生16个脉冲并发送模式信号与数据信号

{

       uchar t;

       CS=1;

       SCLK=0;

       delay(5);

       CS=0;  //低电平允许写入

       delay(2);

       for (t=0;t<8;t++) //发送状态

       {

              MOSI=num1[t];

              delay(2);

              SCLK=1;

              delay(2);

              SCLK=0;

       }

       for (t=0;t<8;t++) //发送数据

       {

              MOSI=num[t];

              delay(2);

              SCLK=1;

              delay(2);

              SCLK=0;

       }

       delay(2);

       CS=1;  //高电平结束写入状态

}

为了保证实验的顺利进行,本人用模拟spi程序利用proteus上的51单片机模型进行了波形时序的论证

调用单片机SPI模块

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sfr SPCTL=0xce;

sfr SPSTAT=0xcd;

sfr SPDAT=0xcf;

sbit CS=P1^4;

sbit SCLK=P1^7;

sbit MOSI=P1^5;

uchar flag,count;

void delay(uchar j)

{

       uchar i;

       i=125;

       for(;j>0;j--)

       {

       while(i--)

       {

              ;

       }

}

}

void main()

{

       TR0=0;

       TMOD=0x01; //设置定时器为方式1 16位 并且工作于计时状态

       TH0=0x3c;  //目标间隔5秒,晶振位4M,一个机器周期3us

                   //让定时器计时0.15s再由i计数33次

                    //(2^16-50000)为TH0与TL0中值

       TL0=0xb0;

       EA=1;   //开总中断

       ET0=1;   //开定时器T0中断

       count=33;

       SPCTL=0xfc;

       MOSI=1;

       flag=0;

      

       while(1)

       {

              while(flag);

              CS=0;

              delay(200);

              SPDAT=0X11; //写入数据进行发送

              while((SPSTAT&0x80)==0); //等待SPI发送完成

              SPSTAT=0x00;

              SPDAT=0x4c;

              while((SPSTAT&0x80)==0);

              SPSTAT=0x00;

              CS=1;

              flag=1;

              TR0=1;

             

              while(flag);

              CS=0;

              delay(1);

              SPDAT=0x11;

              while((SPSTAT&0x80)==0);

              SPSTAT=0x00;

              SPDAT=0xcc;

              while((SPSTAT&0x80)==0);

              SPSTAT=0x00;

              CS=1;

         flag=1;

              TR0=1;

       }

}

void timer0() interrupt 1 //中断函数因为使用定时器T0

                               //所以中断号为1

{

       TH0=0x3c;

       TL0=0xb0;

       count--;

       if(count<=0)

       {

              flag=0;

              count=33;

              TR0=0;

       }

}

该程序的框图

实验现象

增益为-3.31

增益为-4.95

关于实验结果与理论值差异的说明!

在实验中得到了实验现象,发现该增益在-3与-5左右变化。这与设计的增益有着很大的差异,在后续的复盘中我发现自己将数字电位计的PWB引脚错误的接到了PWA引脚上,导致输入的电阻为2与7。根据反相比例放大电路增益公式,得到的结果符合这对阻值。

### 回答1: 要实现可变增益电路放大倍数在-2和-4之间来回切换,可以通过控制MCP41010数字电位器的阻值来实现。下面是一个简单的单片机程序实现的步骤: 1. 首先,必须连接MCP41010数字电位器到单片机的引脚。将数字电位器的CS(Chip Select)引脚连接到单片机的一个IO口,将数字电位器的SCK(时钟)引脚连接到单片机的另一个IO口,将数字电位器的SDI(数据输入)引脚连接到单片机的第三个IO口。 2. 在程序中定义两个变量,一个表示当前的增益倍数,另一个表示增益倍数的切换方向。 3. 在程序中设置MCP41010数字电位器的初始化函数,通过发送特定的命令字节来初始化数字电位器。具体的初始化命令可以参考MCP41010的数据手册。 4. 编写一个函数用于切换增益倍数。该函数根据当前的增益倍数和切换方向,计算下一个增益倍数,并通过发送特定的命令字节到MCP41010来设置数字电位器的阻值。 5. 在主程序中使用一个循环不断切换增益倍数。该循环中,首先调用切换增益倍数的函数,然后延迟一段时间,再次循环。 通过以上步骤,就可以实现可变增益电路放大倍数在-2和-4之间来回切换的功能。需要注意的是,具体的程序细节可能会根据单片机型号和使用的开发环境有所不同,以上只是一个简单的示例。在实际应用中还需要根据具体情况进行调试和优化。 ### 回答2: 要实现可变增益电路放大倍数在-2和-4之间来回切换,可以利用MCP41010数字电位器和单片机编写程序来控制。 首先,需要连接MCP41010数字电位器到单片机MCP41010有3个引脚:VDD、VSS和VOUT,我们需要连接VDD和VSS到单片机的电源引脚,以供电给MCP41010。然后,需要连接单片机SPI接口(如MOSI、SCK和CS)到MCP41010的对应引脚,以进行通信。 接下来,可以编写单片机程序来实现切换功能。首先,在程序中定义SPI通信所需的引脚和相关参数。然后,使用SPI接口发送特定命令给MCP41010,来设置电位器的增益值。具体来说,可以使用命令来设置电位器为-2和-4之间的增益值。 程序可以通过不断循环来实现来回切换。可以使用一个变量来记录当前的增益值,并使用条件语句来判断应该切换到哪个增益值。当切换到另一个增益值后,应该更新当前增益值的变量,并发送相应的命令给MCP41010。可以使用延时函数来控制切换的时间间隔,以使切换更加平滑。 在程序中,还可以添加其他功能,例如监控当前增益值的显示,以使用户了解当前放大倍数。 总之,通过连接MCP41010数字电位器到单片机,并编写程序实现切换功能,可以实现可变增益电路放大倍数在-2和-4之间来回切换。 ### 回答3: 要实现可变增益电路放大倍数在-2和-4之间来回切换,可以使用MCP41010数字电位器来控制放大电路增益。以下是一个可能的单片机程序实现: 1. 首先,初始化单片机的I/O引脚,将MCP41010的控制线(片选线,时钟线,数据线)连接到单片机的相应引脚。 2. 设置MCP41010的工作模式为Potentiometer(电位器模式),使其输出电压按照数字控制信号变化。 3. 在单片机程序中,定义并初始化两个变量:gain1和gain2,分别代表增益-2和-4。 4. 进入主循环,在循环中实现增益的切换。 5. 将gain1的值通过SPI总线发送给MCP41010,设置输出电压对应增益-2的位置。 6. 等待一段时间,使电路稳定。 7. 将gain2的值通过SPI总线发送给MCP41010,设置输出电压对应增益-4的位置。 8. 再次等待一段时间,使电路稳定。 9. 重复步骤5到8,实现来回切换。 10. 可以根据需要调整切换增益的时间间隔,如增加延迟时间或使用定时器来控制。 这样,单片机程序就能实现可变增益电路放大倍数在-2和-4之间来回切换的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值