OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6315|回复: 4

求助 关于TM7705怎么也调不出来 请问是什么原因?

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-3-15
在线时间
1 小时
发表于 2015-5-7 10:33:35 | 显示全部楼层 |阅读模式
5金钱
公司让我调试TM7705,接的是压力传感器  全桥的先上图:


这是我自己接的线路。
下面是代码
[mw_shl_code=c,true] #include <reg51.h> #include<lcd.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit AD_CLK=P1^0;//串行时钟 sbit AD_DRDY=P1^1;//忙标志位 sbit AD_DIN =P1^2;//串行数据输入 sbit AD_DOUT=P1^3;//串行数据输出 uchar USRTdata[8]={'0','0','0','0','0','0','0','0'}; unsigned int DATA1=0; void delay10us(uint c) //误差 -0.234375us { unsigned char a,b; for(b=c;b>0;b--) { for(a=3;a>0;a--); } } /************************************************************************************ 写1字节到AD7705 ************************************************************************************/ void write_ad(uchar i) { uchar a; for(a = 8;a > 0;a--) { if((i & 0x80) == 0) { AD_DIN = 0; } else { AD_DIN = 1; } i <<= 1; AD_CLK = 0; _nop_(); _nop_(); _nop_(); AD_CLK = 1; } } /************************************************************************************ 设置AD7705通道 * 0 为第一通道 * 1 为第二通道 //MD1(0) 工 作 模 式 //MD0(0) 工 作 模 式 //G2(0) 增益选择 0 0 0 0 1 1 1 1 //G1(0) 增益选择 0 0 1 1 0 0 1 1 //G0(0) 增益选择 0 1 0 1 0 1 0 1 // 1 2 4 8 16 32 64 128 //B/U(0) 单极性/双极性工作。“0”表示选择双极性操作,“1”表示选择单极性工作 //BUF(0) 缓冲器控制。“0”表示片内缓冲器短路,缓冲器短路后,电源电流降低 // 此位处于高电平时,缓冲器与模拟输入串联,输入端允许处理高阻抗源 //FSYNC(1) 滤波器同步 //设置40H 双极性方式 44H 单极性方式 //-----短路滤波器后线性也好了 ************************************************************************************/ /*void set_7705_ch(bit a) { if(a == 0) { write_ad(0x20);//write_ad(0x20); 指向时钟寄存器 通道1 write_ad(0x05);// 外部时钟除以2为系统时钟 write_ad(0x10);//write_ad(0x10); 指向设置寄存器 write_ad(0x44);//自校正 增益为1 单极性 缓冲器短路 滤波器打开 } else { write_ad(0x21);//write_ad(0x20); 指向时钟寄存器 通道2 write_ad(0x05); write_ad(0x11);//write_ad(0x10); 指向设置寄存器 通道2 write_ad(0x44);//自校正 增益为4 单极性 缓冲器短路 滤波器打开 } } */ void TM7705_init() { write_ad(0x20);//写时钟寄存器命令00100000; write_ad(0x05);//设置时钟寄存器00000101 write_ad(0x10);//写设置寄存器命令 00010000 write_ad(0x40);//设置设置寄存器 自校准 增益为1 双极性 缓冲器短路 滤波器处理数据 01000000 } //************************************************************************************ // 读1字节到AD7705 //*********************************************************************************** uchar read_ad() { uchar temp2; uchar a; for(a = 8;a > 0;a--) { AD_CLK = 0; _nop_(); _nop_(); _nop_(); AD_CLK = 1; _nop_(); _nop_(); _nop_(); temp2 <<= 1; if(AD_DOUT == 0) { temp2 &= 0xfe; } else { temp2 |= 0x01; } } return temp2; } /************************************************************************************ 读AD7705转换后的数据 ,不检测DRDY ************************************************************************************/ unsigned int readAD_data() { uint temp; uchar i; for(i = 16;i > 0;i--) { AD_CLK = 0; _nop_(); _nop_(); _nop_(); AD_CLK = 1; _nop_(); _nop_(); _nop_(); temp <<= 1; if(AD_DOUT == 0) { temp &= 0xfffe; } else { temp |= 0x0001; } } return temp; } void rst_ad()//复位串口程序 { unsigned char i; for(i=0;i<64;i++) { /* 多于连续32个 DIN=1 使串口复位 */ AD_CLK=0; write_ad(0xff); AD_DIN =1; write_ad(0xff); AD_CLK=1; write_ad(0xff); } } void USRTShowData(uint ShowData)//1602显示程序 { int i; USRTdata[0]='0'+(ShowData/10000); ShowData%=10000; USRTdata[1]='0'+(ShowData/1000); ShowData%=1000; USRTdata[2]='0'+(ShowData/100); ShowData%=100; USRTdata[3]='0'+(ShowData/10); USRTdata[4]='0'+(ShowData%10); for(i=0;i<8;i++) { LcdWriteData(USRTdata); } } void main(void) { TM7705_init(); LcdInit(); rst_ad(); // P1=0x00; LcdWriteCom(0x80); USRTShowData(DATA1); rst_ad(); delay10us(10); while(1) { write_ad(0x38); delay10us(1000); DATA1=readAD_data(); LcdWriteCom(0x80); USRTShowData(DATA1); //delay10us(1000); /* delay10us(1000); LcdWriteCom(0x80); USRTShowData(DATA1); delay10us(1000); LcdWriteCom(0x80); USRTShowData(DATA1); delay10us(1000); LcdWriteCom(0x80); USRTShowData(DATA1); delay10us(1000); LcdWriteCom(0x80); */ } }[/mw_shl_code]

我调试的OUT和DRDY总是输出高电位   我的1602LCD屏总是显示65535,这是怎么回事 求大神指点,我都快忙活了一星期了,/static/image/smiley/kindeditor/50.gif


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-5-8 00:08:38 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-3-15
在线时间
1 小时
 楼主| 发表于 2015-5-8 10:45:48 | 显示全部楼层
没人回答吗?
回复

使用道具 举报

10

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2015-5-8
在线时间
2 小时
发表于 2015-5-8 13:52:41 | 显示全部楼层
不知道你的AD7705是不是调通的?TM7705与AD7705完全兼容,程序一样,脚位一样,直接拿来就可以替换的。有需要样品资料可以交流QQ3247925842

下面是控制参考代码,不知道能否帮到你

设置TM7705的程序代码
表 16 给出了TM7705 和微控制器接口的用C 代码写成的一组读、写程序。  
此程序的几个步骤是:  
      1. 向通信寄存器写数据,选择通道1作为有效通道,将下一个操作设为对时钟寄存器进行写操作。  
      2.  对时钟寄存器写操作,设臵 CLK DIV位,将外部时钟除二,假定外部时钟频率为4.9512MHz  ,
更新率选为50Hz。  
      3. 向通信寄存器写数据。选择通道1作为有效通道。将下一个操作设为对设臵寄存器的写操作。  
      4. 向设臵寄存器写数据,将增益设为 1,设臵为双极性、非缓冲模式,清除滤波器同步,开始自校准。   
       5. 查询DRDY 输出。  
      6. 从数据寄存器上读数据。  
      7. 跳回第5、第6 步,直到从选定的通道中取出指定数量的采样。

表 16    TM7705与68HC11 微处理器接口的C 语言代码  
/* This program has read and write routines for the 68HC11 to interface to the TM7705  and the sample program
sets the various registers and then reads1000 samples from one channel.*/  
#include <math.h>  
#include <io6811.h>  
#define NUM_SAMPLES 1000 /* change the number of data samples*/  
#define MAX_REG_LENGTH 2 /* this says that the max length of a register is 2 bytes*/  
Writetoreg (int);  
Read(int,char);  
char *datapointer = store;
char store[NUM_SAMPLES*MAX_REG_LENGTH + 30];  
void main()  
{   /* the only pin that is programmed herefrom the 68HC11  is the /CS and this is why the PC2 bit of PORTC  is
made as an output */  
char a;  
DDRC  = 0x04;    /*    PC2 is an output the restof the port bits are inputs */  
PORTC | = 0x04;  /*  make the /CS line high */  
Writetoreg(0x20); /* Active Channel is Ain1(+)/Ain1(-),next operation aswrite to the clock register*/  
Writetoreg(0x0C);  /*  master clock enabled,4.9512MHz  Clock, set output  rate to 50Hz*/  
Writetoreg(0x10); /* Active Channel is Ain1(+)/Ain1(-),next operation aswrite to the setup register*/  
Writetoreg(0x40); /* gain = 1, bipolar mode, buffer off, clear FSYNC and perform a Self Calibration*/  
while(PORTC & 0x10); /* wait for /DRDY to go low */  
for(a=0;a<NUM_SAMPLES;a++)
{  
              Writetoreg(0x38); /*set the next operation for 16 bit read from the data register*/  
              Read(NUM_SAMPES,2);  
              }  
}  
Writetoreg(int    byteword);  
{  
int q;  
SPCR = 0x3f;  
SPCR = 0X7f; /* this setsthe WiredOR mode(DWOM=1), Master mode(MSTR=1),          SCK idles high(CPOL=1), 
/SS can be low always(CPHA=1), lowest clock speed(slowestspeedwhich is masterclock /32 */  
DDRD= 0x18; /*    SCK,  MOSI  outputs */  
q = SPSR;  
q = SPDR;  /* the read of the stausregister and of the data register is needed to clear the interrupt which tells the
user that the data transfer is complete */  
PORTC &=  0xfb; /* /CS is low */  
SPDR = byteword;  /*  put the byte into data register*/  
while(!(SPSR & 0x80));       /* wait for /DRDY  to go low */  
PORTC |=  0x4;  /* /CS high */
}  
Read(int amount, int reglength)  
{  
int q;  
SPCR = 0x3f;  
SPCR = 0x7f;  /*  clear the interupt */  
DDRD  = 0x10;  /*  MOSI  output,  MISO  input, SCK output */  
while(PORTC & 0x10);        /* wait for /DRDY  to go low */  
PORTC & 0xfb ; /* /CS is low */  
for(b=0;b<reglength;b++)  
              {  
              SPDR = 0;  
              while(!(SPSR & 0x80)); /* wait until  port ready before reading*/  
              *datapointer++=SPDR; /* read SPDR into store array via datapointer */  
              }  
PORTC|=4; /* /CS is high */  
}
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-3-15
在线时间
1 小时
 楼主| 发表于 2015-5-10 17:41:26 | 显示全部楼层
换了一个芯片问题解决了 但是有出现新的问题了,TM7705的DOUT端口在与单片机端口连接时,脉冲波形衰竭了将近一半!这是怎么回事?


这是DOUT没有和单片机端口连接的波形图!(1、串行时钟 2、DIN  3、DOUT)


这是DOUT与单片机连接的波形图 明显能看出来3号线脉冲电压降低了,脉冲也变化了, 这是怎么回事?


坐等大神啊 
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表