Mos管,网络上双向电平转换电路如下图,我想问的是3.3V难道不需要加上啦电阻吗?
3.3V不需要加上拉电阻。上拉的意思是,当5V-IO这个网络没有被确定一个电压的时候,通过一个电阻连接到5V,那么这个网络就被确定为5V了,这个电阻就叫做“上拉电阻”。因为有了上拉电阻隔开,5V-IO这个网络可以被拉低到0伏特。3.3V与MOS管连接的那里,直接连接就行了,它需要一直为3.3V,加个电阻还多余了。具体的原理,可以看下这篇文章,链接在这里。完整的MOS管双向电平转换电路见下图,常用在i2c电平转换上。
关于加速度传感器MMA7455的I2C通讯
I2C的通信都是遵守I2C通信协议的,跟使用什么芯片没关系,有差别的地方在于有些芯片用单字节的读写,有些用多字节的读写,建议去看I2C通信协议,以不变应万变。
单字节写:
把 MMA7455 7位的设备地址+第8位 表示写,写入,等待处理从机的ACK,再写入8位寄存器地址,等待处理从机的ACK,再写入8位数据,等待处理从机的ACK,结束
单字节读:
把 MMA7455 7位的设备地址+第8位 表示写,写入,等待处理从机的ACK,再写入8位寄存器地址,等待处理从机的ACK,再写入7位的设备地址+第8位 表示读, 接着读取8位数据,等待处理从机的ACK,结束
如果从机的寄存器地址是 16位的,则连续分两次发送,一次发8位;如果从 从机寄存器读到的数据是16位,则连续读2次 8位。 这个要看芯片手册这个芯片是不是多字节读取的,还可以结合I2C 读写驱动里面是怎么写的,看读取完放在一个多大的数组
电平转换电路有什么作用
电平转换在电路设计中非常常见,因为做电路设计很多时候就像在搭积木,这个电路模块,加上那个电路模块,拼拼凑凑连起来就是一个电子产品了。而各电路模块间经常会出现电压域不一致的情况,所以模块间的通讯就要使用电平转换电路了。比如各模块通过I2C总线通讯时,挂在总线上的有使用3.3V电压域的器件,也有使用5V电压域的器件,通过电平转换的电路,大家就可以愉快地玩耍聊天了。下图是可以用在I2C总线的电平转换电路。参考自文章《MOS管电平转换电路》
求飞思卡尔MMA7455的verilog的读写模块代码
/********************************************************
【dev.env.】KEIL UV4.2
【Target 】AT89C52
【Crystal 】11.0592Mhz
LQ-7455加速度模块测试程序
********************************************************/
#include
#include "intrins.h"
//nop指令个数定义
#define nops() {_nop_();_nop_();_nop_();_nop_();_nop_();}
//端口位定义,可修改
sbit SDA=P1^1; //IIC数据线定义
sbit SCL=P1^0; //IIC时钟线定义
//内部数据定义
unsigned char IIC_ad_main; //器件从地址
unsigned char IIC_ad_sub; //器件子地址
unsigned char *IIC_buf; //发送|接收数据缓冲区
unsigned char IIC_num; //发送|接收数据个数
#define ack 1 //主应答
#define no_ack 0 //从应答
void send232byte(unsigned char bytebuf)
{
SBUF=bytebuf;
while(!TI);
TI=0;
}
void IIC_start(void){
SCL=0;
SDA=1;
_nop_();
SCL=1;
nops();
SDA=0;
nops();
SCL=0;
}
//************************************************
//送停止位 SDA=0->1
void IIC_stop(void){
SCL=0;
_nop_();
SDA=0;
_nop_();
SCL=1;
nops();
SDA=1;
nops();
SCL=0;
}
//************************************************
//主应答(包含ack:SDA=0和no_ack:SDA=0)
void IIC_ack_main(bit ack_main){
SCL=0;
if(ack_main)SDA=0; //ack主应答
else SDA=1; //no_ack无需应答
nops();
SCL=1;
nops();
SCL=0;
}
//*************************************************
//字节发送程序
//发送c(可以是数据也可是地址),送完后接收从应答
//不考虑从应答位
void send_byte(unsigned char c){
unsigned char i;
for(i=0;i<8;i++){
SCL=0;
if((c<<i) & 0x80)SDA=1; //判断发送位
else SDA=0;
_nop_();
SCL=1;
nops();
SCL=0;
}
nops();
SDA=1; //发送完8bit,释放总线准备接收应答位
_nop_();
SCL=1;
nops(); //sda上数据即是从应答位
SCL=0; //不考虑从应答位|但要控制好时序
}
//**************************************************
//字节接收程序
//接收器件传来的数据,此程序应配合|主应答函数|IIC_ack_main()使用
//return: uchar型1字节
unsigned char read_byte(void){
unsigned char i;
unsigned char c;
c=0;
SCL=0;
_nop_();
SDA=1; //置数据线为输入方式
for(i=0;i<8;i++){
_nop_();
SCL=0; //置时钟线为低,准备接收数据位
nops();
SCL=1; //置时钟线为高,使数据线上数据有效
_nop_();
c<<=1;
if(SDA)c+=1; //读数据位,将接收的数据存c
}
SCL=0;
return c;
}
//***************************************************
//向无子地址器件发送单字节数据
void send_to_byte(unsigned char ad_main,unsigned char c){
IIC_start();
send_byte(ad_main); //发送器件地址
send_byte(c); //发送数据c
IIC_stop();
}
//***************************************************
//向有子地址器件发送多字节数据
void send_to_nbyte(unsigned char ad_main,unsigned char ad_sub,unsigned char *buf,unsigned char num){
unsigned char i;
IIC_start();
send_byte(ad_main); //发送器件地址
send_byte(ad_sub); //发送器件子地址
for(i=0;i<num;i++){
send_byte(*buf); //发送数据*buf
buf++;
}
IIC_stop();
}
//***************************************************
//从无子地址器件读单字节数据
//function:器件地址,所读数据存在接收缓冲区当前字节
void read_from_byte(unsigned char ad_main,unsigned char *buf){
IIC_start();
send_byte(ad_main); //发送器件地址
*buf=read_byte();
IIC_ack_main(no_ack); //无需应答
IIC_stop();
}
//***************************************************
//从有子地址器件读多个字节数据
//function:
void read_from_nbyte(unsigned char ad_main,unsigned char ad_sub,unsigned char *buf,unsigned char num){
unsigned char i;
IIC_start();
send_byte(ad_main);
send_byte(ad_sub);
for(i=0;i<num-1;i++){
*buf=read_byte();
IIC_ack_main(ack); //主应答
buf++;
}
*buf=read_byte;
buf++; //本次指针调整无意义,目的是操作后buf指向下一地址
IIC_ack_main(no_ack); //无需应答
IIC_stop();
}
unsigned char MMA7455_readbyte(unsigned char address)
{
unsigned char ret = 100;
IIC_start();//启动
send_byte(0x3A);//写入设备ID及写信号
send_byte(address);//X地址
IIC_start();//重新发送开始
send_byte(0x3B);//写入设备ID及读信
ret = read_byte();//读取一字节
IIC_stop();
return ret;
}
//写入
void MMA7455_writebyte(unsigned char address, unsigned char thedata)
{
IIC_start();//启动
send_byte(0x3A);//写入设备ID及写信号
send_byte(address);//X地址
send_byte(thedata);//写入设备ID及读信
IIC_stop();
}
//初始化
//初始化为指定模式
void MMA7455_init()
{
MMA7455_writebyte(0x16, 0x05);
}
void main()
{ unsigned char x, y, z;
TMOD=0x21; //定时T1方式2,C/T=0,M1=1,定时T0方式1, M0=1
SCON=0x60;//8 bit SM1=SM2=1,SM0=0, REN=0
TL1=0xfd;//9600
TH1=0xfd;
TR1=1;
ET0=1;
EA=1;
MMA7455_init();//初始化MMA7455
while(1)
{//读取重力信息
x = MMA7455_readbyte(0x06);
y = MMA7455_readbyte(0x07);
z = MMA7455_readbyte(0x08);
send232byte(0x55);
send232byte(0xAA);
send232byte(x);
send232byte(y);
send232byte(z);
}
}
500HZ的频率对加速度传感器信号进行采样,如何做简单的RC硬件滤波?
根据采样定律,为了避免采样频谱混叠,应该滤除fs/2以上的频谱,即250Hz以上频率,因此低通滤波器应该在200Hz以下,如果是简单的一阶低通,最好100Hz以下,方能有效清除250Hz以上的频率。
可以按照RC=1/2πf计算,例如16k配0.1μF,则转折频率100Hz。串联的电阻应该包括信号源内阻,并联的电容最好用CBB系列聚丙烯电容,容量较为准确。