找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6641|回复: 22
打印 上一主题 下一主题
收起左侧

关于stc15w204s单片机与TM7707的驱动问题

[复制链接]
跳转到指定楼层
楼主
20黑币
  1. //驱动程序
  2. sbit AD7707_DRDY = P1^0;
  3. sbit AD7707_DIN  = P3^6;
  4. sbit AD7707_DOUT = P3^7;
  5. sbit AD7707_SCLK = P1^1;

  6. void write_byte1(uchar date);
  7. uchar read_byte1();
  8. void init1();
  9. void init2();
  10. unsigned long read_ch1_result();
  11. unsigned long read_ch2_result();

  12. void write_byte1(uchar date)
  13. {
  14.                 uchar i;
  15.                 for(i=0;i<8;i++)
  16.                 {
  17.                                 AD7707_SCLK=0;
  18.                                 _nop_();
  19.                                 if(date&0x80)
  20.                                         AD7707_DIN=1;
  21.                                 else
  22.                                         AD7707_DIN=0;
  23.                                 AD7707_SCLK=1;
  24.                                 date<<=1;
  25.                 }
  26. }

  27. uchar read_byte1( )
  28. {
  29.                 uchar j,b1;
  30.                 for(j=0;j<8;j++)
  31.                 {
  32.                                 AD7707_SCLK=0;
  33.                                 b1=(b1<<1)|AD7707_DOUT;
  34.                                 AD7707_SCLK=1;
  35.                 }
  36.                 return b1;
  37. }

  38. void init1()
  39. {
  40.                 AD7707_SCLK=1;
  41.                 AD7707_DIN=1;
  42.                 AD7707_DRDY=1;
  43.                 write_byte1(0X10);
  44.                 write_byte1(0X40);
  45.                 write_byte1(0X50);
  46.                 write_byte1(0X00);
  47.                 write_byte1(0X20);
  48.                 write_byte1(0X0f);
  49. }



  50. void init2()
  51. {
  52.                 AD7707_SCLK=1;
  53.                 AD7707_DIN=1;
  54.                 AD7707_DRDY=1;
  55.                 write_byte1(0X11);
  56.                 write_byte1(0X40);
  57.                 write_byte1(0X50);
  58.                 write_byte1(0X00);
  59.                 write_byte1(0X20);
  60.                 write_byte1(0X0f);
  61. }

  62. unsigned long read_ch1_result()
  63. {
  64.                 unsigned long TM_result;
  65.                 uchar i,a[3]={1,2,3};
  66.                 AD7707_DRDY=1;

  67.                 while(AD7707_DRDY);
  68.                 write_byte1(0x38);

  69.                 for(i=0;i<3;i++)
  70.                 {
  71.                                 a[i]=read_byte1();
  72.                 }
  73.                 AD7707_DRDY=1;
  74.                 TM_result=a[2]+(a[1]*256)+(a[0]*65536);
  75.                 return TM_result;
  76. }
  77. /*
  78. 问题:在读取的时候,程序卡在了while(AD7707_DRDY);这句,请教如何解决
  79. */
复制代码

51hei截图_20210504141748.png (29.26 KB, 下载次数: 93)

TM7707

TM7707

51hei截图_20210504141725.png (39.6 KB, 下载次数: 95)

stc15w204s

stc15w204s

最佳答案

查看完整内容

数值稳定,那是不是你分压网络或2.5v基准的误差没计算调节好,采集计算时乘上一个误差系数就可以了吧
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:796531 发表于 2021-5-4 14:22 | 只看该作者
fkup 发表于 2021-5-11 20:45
是的,我分频后2.75MHZ,频率整好了。但是采集总差点意思,数据总有些偏差,稳定性还可以,同一个电压前 ...

数值稳定,那是不是你分压网络或2.5v基准的误差没计算调节好,采集计算时乘上一个误差系数就可以了吧
回复

使用道具 举报

板凳
ID:390416 发表于 2021-5-4 18:23 | 只看该作者
用他们官方的参考代码 准行
回复

使用道具 举报

地板
ID:466759 发表于 2021-5-4 20:35 | 只看该作者
你这个应该是改的AT89的程序,更换为stc15w204s需要注意端口模式的问题,试试在main中加入对端口的初始化,P0M0=0x00;P0M1=0x00;P1M0=0x00;P1M1=0x00;P2M0=0x00;P2M1=0x00;P3M0=0x00;P3M1=0x00;
我对比了一下你们的程序,没发现什么问题,可以试试加入上面的,如果不行,可以检查一下TM7707是不是好的,也可以检查一下电路连接!
回复

使用道具 举报

5#
ID:230742 发表于 2021-5-4 20:59 | 只看该作者
你想问什么?
回复

使用道具 举报

6#
ID:260951 发表于 2021-5-4 21:16 | 只看该作者
cheny736 发表于 2021-5-4 20:35
你这个应该是改的AT89的程序,更换为stc15w204s需要注意端口模式的问题,试试在main中加入对端口的初始化, ...

IO口应该是没问题的
回复

使用道具 举报

7#
ID:260951 发表于 2021-5-4 21:22 | 只看该作者

阅读芯片手册,发现MCLKIN引脚需要时钟信号, 我贴出来的驱动程序,应该是那种有晶振电路的。而我的硬件设备没有这个,只能靠软件模拟时钟信号。我想读取标志位无变化,是不是我芯片初始化就没有成功。或是我模拟的时钟信号有问题
回复

使用道具 举报

8#
ID:790408 发表于 2021-5-4 21:29 | 只看该作者
你不因该说说那里有问题,你做了些什么处理等嘛,这不是让别人给你写代码嘛,
回复

使用道具 举报

9#
ID:790408 发表于 2021-5-4 21:30 | 只看该作者
卡在AD7707_DRDY说明这个值一直为1呀
回复

使用道具 举报

10#
ID:260951 发表于 2021-5-4 21:33 | 只看该作者
人人学会单片机 发表于 2021-5-4 18:23
用他们官方的参考代码 准行

没找到官方的
回复

使用道具 举报

11#
ID:260951 发表于 2021-5-4 21:45 | 只看该作者
请问一下,MCLK IN 这个引脚需要给怎样一个时钟啊,可以定时器模拟PWM作为时钟信号吗?
回复

使用道具 举报

12#
ID:230742 发表于 2021-5-7 00:40 | 只看该作者
我帮你百度了一下,MCLK IN 和MCLK OUT 接的是一个晶振。
https://blog.csdn.net/qq_37387733/article/details/105136060
我建议还是接个晶振。毕竟单片机分频输出我也没用过。感觉单片机一忙别的,输出的频率就不稳了。比如开中断关中断。你要24位这么高的精度,然后不给他一个高精度的晶振。我看很难。
回复

使用道具 举报

13#
ID:260951 发表于 2021-5-7 22:24 来自手机 | 只看该作者
啤酒瓶子老大 发表于 2021-5-7 00:40
我帮你百度了一下,MCLK IN 和MCLK OUT 接的是一个晶振。
https://blog.csdn.net/qq_37387733/article/det ...

mclkin这个引脚常见的的确是接晶振,我这个受硬件限制,只能用io模拟了,但是我看7707这个需要一个2.4mhz的信号,用定时器貌似行不通。目前想到两个方案,一个是用pwm,用pwm的话就有个问题点是,stc15w204s这个芯片的pwm输出引脚是否可以随意指定,我这个是p5-4,手册上的pwm输出引脚都完美的避开了这个引脚,再有一个就是不知道pwm输出能否达到2.4mhz以上。第二个方案是,直接将单片机主频拉到了30mhz,然后while循环里面将p54取反,频率可以达到2.75mhz。但是这样做,mcu就只做io翻转了,读取7707这个芯片的值也不好弄了。我的想法是在定时器中断里面读,这样对mclkin这个引脚的频率影响也不会很大。
     mclkin这个地方的频率给上了,tm7707读取标志位也可以成功置位,但是苦恼的是读出的结果是错的,也还没搞清楚是读取错了,还是计算最终结果错了,基准电压是2.5v
回复

使用道具 举报

14#
ID:230742 发表于 2021-5-8 01:14 | 只看该作者
百度还说了一个问题。7707和7705的寄存器是不同的,你仔细看看7707的手册,如果还是没有头绪,就看看7705的手册。用7705的寄存器地址定义试一下。意思是市场上有些7707是7705仿制的。
回复

使用道具 举报

15#
ID:260951 发表于 2021-5-8 17:21 | 只看该作者
啤酒瓶子老大 发表于 2021-5-8 01:14
百度还说了一个问题。7707和7705的寄存器是不同的,你仔细看看7707的手册,如果还是没有头绪,就看看7705的 ...

有试过用7705的驱动代码,效果差不多,DRDY引脚会变为低电平,但是最后数据还是不对
回复

使用道具 举报

16#
ID:260951 发表于 2021-5-11 09:03 | 只看该作者
p54可以输出51内部晶振频率
回复

使用道具 举报

17#
ID:796531 发表于 2021-5-11 14:32 | 只看该作者
本帖最后由 paladina 于 2021-5-11 14:35 编辑

P54可以输出时钟,但需要配置分频 后提供给TM7707. 在TM7707初始化函数里加入 CLK_DIV = 0xC0;          //P54=SYSCLK/4 。我做过好几块STC15+TM7707的板子了,没问题的,void TM770x_Config(void)
{
        CLK_DIV = 0xC0;        //P54=SYSCLK/4
       
        TM_RESET = 0;
        delay_ms(10);
        TM_RESET = 1;
       
        TM_DOUT = 1;
        TM_DIN = 1;
        TM_SCLK = 1;
        TM_CS = 1;
        TM_DRDY = 1;
        delay_ms(5);
       
        TM_WriteByte(0x40);
        TM_WriteByte(0x01);
        delay_ms(10);
       
       
        /* 通道1 */
        //滤波器低八位
        TM_WriteByte(0x50);
        TM_WriteByte(0x00);
        //滤波器高八位
        TM_WriteByte(0x20);
        TM_WriteByte(0x16);
       
        //自校准
        TM_WriteByte(0x10);
        TM_WriteByte(0x44);
        while(TM_DRDY) { _nop_(); }
       
        /* 通道2 */
        //滤波器低八位
        TM_WriteByte(0x51);
        TM_WriteByte(0x00);
        //滤波器高八位
        TM_WriteByte(0x21);
        TM_WriteByte(0x16);
       
        //自校准
        TM_WriteByte(0x11);
        TM_WriteByte(0x6C);
        while(TM_DRDY) { _nop_(); }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

18#
ID:260951 发表于 2021-5-11 20:45 | 只看该作者
paladina 发表于 2021-5-11 14:32
P54可以输出时钟,但需要配置分频 后提供给TM7707. 在TM7707初始化函数里加入 CLK_DIV = 0xC0;          // ...

是的,我分频后2.75MHZ,频率整好了。但是采集总差点意思,数据总有些偏差,稳定性还可以,同一个电压前后测试,得到的数据一样,就是和正确值差点。  我想问一下你的这个主频是多少,分频后是多少,我用你的配置试了一下,采集的数据也是不对的。
回复

使用道具 举报

19#
ID:260951 发表于 2021-5-12 14:50 | 只看该作者
paladina 发表于 2021-5-12 09:42
数值稳定,那是不是你分压网络或2.5v基准的误差没计算调节好,采集计算时乘上一个误差系数就可以了吧

已经解决了,应该是寄存器的配置
回复

使用道具 举报

20#
ID:18016 发表于 2021-6-22 07:08 | 只看该作者
fkup 发表于 2021-5-12 14:50
已经解决了,应该是寄存器的配置

你好我也遇到了同样的问题 能具体的说一下嘛
回复

使用道具 举报

21#
ID:236035 发表于 2021-7-28 16:00 | 只看该作者
sydaxia 发表于 2021-6-22 07:08
你好我也遇到了同样的问题 能具体的说一下嘛

参考7705的寄存器配置
回复

使用道具 举报

22#
ID:388477 发表于 2023-9-9 14:12 | 只看该作者
我现在是用tm7707,现在电压两路正常,但是计算公式不对啊,v=adc值/16777216,不是应该是v=2.5*adc值/16777216才对嘛,有没有遇到的朋友,感谢!
回复

使用道具 举报

23#
ID:388477 发表于 2023-9-9 15:54 | 只看该作者
zhang1314hong 发表于 2023-9-9 14:12
我现在是用tm7707,现在电压两路正常,但是计算公式不对啊,v=adc值/16777216,不是应该是v=2.5*adc值/1677 ...

找到问题了,是读取三个字节的数据后,组合错了,之前参看别人的例程没注意
TM_result=a[2]+(a[1]*256)+(a[0]*65536);这个就可以
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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