标题: 关于stc15w204s单片机与TM7707的驱动问题 [打印本页]

作者: fkup    时间: 2021-5-4 14:22
标题: 关于stc15w204s单片机与TM7707的驱动问题
  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, 下载次数: 156)

TM7707

TM7707

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

stc15w204s

stc15w204s

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

数值稳定,那是不是你分压网络或2.5v基准的误差没计算调节好,采集计算时乘上一个误差系数就可以了吧
作者: 人人学会单片机    时间: 2021-5-4 18:23
用他们官方的参考代码 准行
作者: cheny736    时间: 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是不是好的,也可以检查一下电路连接!
作者: 啤酒瓶子老大    时间: 2021-5-4 20:59
你想问什么?
作者: fkup    时间: 2021-5-4 21:16
cheny736 发表于 2021-5-4 20:35
你这个应该是改的AT89的程序,更换为stc15w204s需要注意端口模式的问题,试试在main中加入对端口的初始化, ...

IO口应该是没问题的

作者: fkup    时间: 2021-5-4 21:22
啤酒瓶子老大 发表于 2021-5-4 20:59
你想问什么?

阅读芯片手册,发现MCLKIN引脚需要时钟信号, 我贴出来的驱动程序,应该是那种有晶振电路的。而我的硬件设备没有这个,只能靠软件模拟时钟信号。我想读取标志位无变化,是不是我芯片初始化就没有成功。或是我模拟的时钟信号有问题
作者: 1922323908    时间: 2021-5-4 21:29
你不因该说说那里有问题,你做了些什么处理等嘛,这不是让别人给你写代码嘛,
作者: 1922323908    时间: 2021-5-4 21:30
卡在AD7707_DRDY说明这个值一直为1呀
作者: fkup    时间: 2021-5-4 21:33
人人学会单片机 发表于 2021-5-4 18:23
用他们官方的参考代码 准行

没找到官方的
作者: fkup    时间: 2021-5-4 21:45
请问一下,MCLK IN 这个引脚需要给怎样一个时钟啊,可以定时器模拟PWM作为时钟信号吗?
作者: 啤酒瓶子老大    时间: 2021-5-7 00:40
我帮你百度了一下,MCLK IN 和MCLK OUT 接的是一个晶振。
https://blog.csdn.net/qq_37387733/article/details/105136060
我建议还是接个晶振。毕竟单片机分频输出我也没用过。感觉单片机一忙别的,输出的频率就不稳了。比如开中断关中断。你要24位这么高的精度,然后不给他一个高精度的晶振。我看很难。
作者: fkup    时间: 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

作者: 啤酒瓶子老大    时间: 2021-5-8 01:14
百度还说了一个问题。7707和7705的寄存器是不同的,你仔细看看7707的手册,如果还是没有头绪,就看看7705的手册。用7705的寄存器地址定义试一下。意思是市场上有些7707是7705仿制的。
作者: fkup    时间: 2021-5-8 17:21
啤酒瓶子老大 发表于 2021-5-8 01:14
百度还说了一个问题。7707和7705的寄存器是不同的,你仔细看看7707的手册,如果还是没有头绪,就看看7705的 ...

有试过用7705的驱动代码,效果差不多,DRDY引脚会变为低电平,但是最后数据还是不对
作者: fkup    时间: 2021-5-11 09:03
p54可以输出51内部晶振频率
作者: paladina    时间: 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_(); }
}


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

是的,我分频后2.75MHZ,频率整好了。但是采集总差点意思,数据总有些偏差,稳定性还可以,同一个电压前后测试,得到的数据一样,就是和正确值差点。  我想问一下你的这个主频是多少,分频后是多少,我用你的配置试了一下,采集的数据也是不对的。
作者: fkup    时间: 2021-5-12 14:50
paladina 发表于 2021-5-12 09:42
数值稳定,那是不是你分压网络或2.5v基准的误差没计算调节好,采集计算时乘上一个误差系数就可以了吧

已经解决了,应该是寄存器的配置
作者: sydaxia    时间: 2021-6-22 07:08
fkup 发表于 2021-5-12 14:50
已经解决了,应该是寄存器的配置

你好我也遇到了同样的问题 能具体的说一下嘛
作者: ly1972001    时间: 2021-7-28 16:00
sydaxia 发表于 2021-6-22 07:08
你好我也遇到了同样的问题 能具体的说一下嘛

参考7705的寄存器配置
作者: zhang1314hong    时间: 2023-9-9 14:12
我现在是用tm7707,现在电压两路正常,但是计算公式不对啊,v=adc值/16777216,不是应该是v=2.5*adc值/16777216才对嘛,有没有遇到的朋友,感谢!

作者: zhang1314hong    时间: 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);这个就可以




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1