找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ads117.h头文件驱动

[复制链接]
跳转到指定楼层
楼主
ID:76127 发表于 2015-4-18 03:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

基于msp430单片机下的ads117.h驱动:
  1. #define SCL_H P2OUT |= BIT4
  2. #define SCL_L P2OUT &= ~BIT4
  3. #define SDA_H P2OUT |= BIT3
  4. #define SDA_L P2OUT &= ~BIT3
  5. #define address 0x90
  6. #define config  0x01     
  7. #define conversion 0x00   
  8. #define Lsiwei  0xE3                     //860sps,比较模式关闭
  9. #define Lsiwei1  0x03                     //8sps,比较模式关闭
  10. #define  channel_0      0                //表示选择通道0和通道1的差分输入
  11. #define  channel_1      1                //表示选择通道1
  12. #define  channel_2      2                //表示选择通道2
  13. #define  channel_3      3                //表示选择通道3

  14. #define SDA_in  P2DIR &= ~BIT3          //SDA改成输入模式
  15. #define SDA_out P2DIR |= BIT3          //SDA变回输出模式
  16. #define SDA_val P2IN&BIT3             //SDA的位值

  17. #define TRUE    1
  18. #define FALSE   0
  19. /******************************
  20. 函数名:delay
  21. 功能:延时程序/////////////15us
  22. ********************************/
  23. void delay1(void)
  24. {
  25.     uchar i;
  26. for(i = 0;i < 15;i++)
  27.    _NOP();
  28. }
  29. /*******************************************
  30. 函数名称:start
  31. 功    能:完成IIC的起始条件操作
  32. 参    数:无
  33. 返回值  :无
  34. ********************************************/
  35. void start(void)
  36. {
  37. SCL_H;
  38. SDA_H;
  39. delay1();
  40. SDA_L;
  41. delay1();
  42. SCL_L;
  43. delay1();
  44. }
  45. /*******************************************
  46. 函数名称:stop
  47. 功    能:完成IIC的终止条件操作
  48. 参    数:无
  49. 返回值  :无
  50. ********************************************/
  51. void stop(void)
  52. {
  53. SDA_L;
  54. delay1();
  55. SCL_H;
  56. delay1();
  57. SDA_H;
  58. delay1();   
  59. }
  60. /*******************************************
  61. 函数名称:mack
  62. 功    能:完成IIC的主机应答操作
  63. 参    数:无
  64. 返回值  :无
  65. ********************************************/
  66. void mack(void)
  67. {
  68. SDA_L;
  69. _NOP(); _NOP();
  70. SCL_H;
  71. delay1();
  72. _NOP();_NOP();
  73. SCL_L;
  74. SDA_H;   
  75. delay1();
  76. }
  77. /*******************************************
  78. 函数名称:mnack
  79. 功    能:完成IIC的主机无应答操作
  80. 参    数:无
  81. 返回值  :无
  82. ********************************************/
  83. void mnack(void)
  84. {
  85. SDA_H;
  86. _NOP(); _NOP();
  87. SCL_H;
  88. delay1();
  89. SCL_L;
  90. _NOP(); _NOP();
  91. SDA_L;  
  92. delay1();      
  93. }
  94. /*******************************************
  95. 函数名称:ack
  96. 功    能:检查从机的应答操作
  97. 参    数:无
  98. 返回值  :从机是否有应答:1--wu,0--you
  99. ********************************************/
  100. void ack()
  101. {
  102.   uchar i;
  103.   i=0;
  104.   SDA_in;
  105.   SCL_H;
  106.   delay1();
  107.   while((P2IN&BIT1)&&(i<250)) i++;
  108.   SDA_out;
  109.   SCL_L;
  110.   delay1();
  111. }
  112. /*******************************************
  113. 函数名称:write1
  114. 功    能:向IIC总线发送一个1
  115. 参    数:无
  116. 返回值  :无
  117. ********************************************/
  118. void write1(void)                      //下降沿发送
  119. {
  120. SDA_H;
  121. delay1();
  122. SCL_H;
  123. delay1();
  124. SCL_L;   
  125. delay1();
  126. }
  127. /*******************************************
  128. 函数名称:write0
  129. 功    能:向IIC总线发送一个0
  130. 参    数:无
  131. 返回值  :无
  132. ********************************************/
  133. void write0(void)                    //下降沿发送
  134. {
  135. SDA_L;
  136. delay1();
  137. SCL_H;
  138. delay1();   
  139. SCL_L;   
  140. delay1();
  141. }
  142. /*******************************************
  143. 函数名称:write1byte
  144. 功    能:向IIC总线发送一个字节的数据
  145. 参    数:wdata--发送的数据
  146. 返回值  :无
  147. ********************************************/
  148. void write1byte(uchar wdata)
  149. {
  150. uchar i;
  151.    
  152. for(i = 8;i > 0;i--)
  153. {
  154.   if(wdata & 0x80)  
  155.                       write1();
  156.   else   
  157.                       write0();
  158.   wdata <<= 1;
  159. }                 

  160. SDA_H;
  161. _NOP();  
  162. }
  163. /*******************************************
  164. 函数名称:read1byte
  165. 功    能:从IIC总线读取一个字节
  166. 参    数:无
  167. 返回值  :读取的数据
  168. ********************************************/
  169. uchar read1byte(void)
  170. {
  171.     uchar  rdata = 0x00,i;
  172.     uchar flag;
  173.    
  174. for(i = 0;i < 8;i++)
  175. {
  176.   SDA_H;
  177.   delay1();
  178.   SCL_H;
  179.                 SDA_in;            //设为输入模式
  180.   delay1();
  181.   flag = SDA_val;  
  182.   rdata <<= 1;
  183.   if(flag) rdata |= 0x01;
  184.                     SDA_out ;           //设为输出模式,输出高电平,空闲
  185.   SCL_L;
  186.   delay1();
  187. }
  188. return rdata;
  189. }
  190. /***********************************
  191. 函数名;Confige1115
  192. 功能:选择通道模式,对ads1115进行初始化
  193. 参数:uchar channel通道编号
  194. ***************************************/
  195. void Confige1115(uchar channel)    //对地址,通道,采样范围,转换速率
  196. {
  197.   uchar a_channel;
  198.   switch (channel)
  199.   {
  200.      case 0:a_channel=0xC2;break;//通道0 ,1倍放大,连续模式
  201.      case 1:a_channel=0xD2;break;//通道1,1倍放大,连续模式
  202.      case 2:a_channel=0xE2;break;//通道2,1倍放大,连续模式
  203.      case 3:a_channel=0xF2;break;//通道3,1倍放大,连续模式
  204.      default: break;
  205.   }
  206.   start();
  207.   write1byte(address);//0x90    //先写地址,,,由Datashit知,address接地时从机地址为0X90
  208.   ack();
  209.   write1byte(config);//0x01     //再写高字节配置,,100 : AINP = AIN0 and AINN = GND,001 : FS = ±4.096V(1)
  210.   ack();
  211.   write1byte(a_channel);        //选择通道
  212.   ack();
  213. // write1byte(Lsiwei1);             //0xe3,8sps,比较模式关闭
  214. write1byte(Lsiwei);           //0xe3,860sps,比较模式关闭    //低字节配置,111 : 860SPS
  215.   ack();
  216.   stop();
  217. }
  218. /**************************************
  219. 函数名:read1115
  220. 功能:从ads1115中读出采样值
  221. **************************************/
  222. long int read1115()     
  223. {
  224.   uchar result_l,result_h;      //结果为两字节
  225.   long int result;
  226.   start();
  227.    write1byte(address);//地址0x90
  228.   ack();
  229.    write1byte(conversion);//写入0x00,告诉ads1115下一步要从conversion register中读数据    ???
  230.   ack();
  231.   stop();
  232.   delay_ms(5);
  233.   start();
  234.   write1byte(address+1);//要读数据了   ????
  235.    ack();
  236.   result_h=read1byte();   //先读高字节
  237.    mack();//主机应答
  238.   result_l=read1byte();  
  239.    mack();//主机应答
  240.    stop();
  241.   result=result_h*256+result_l;   //****很关键
  242.   return result;
  243. }
  244. /***********************************
  245. 函数名:go_1115
  246. 功能:进行一次采样并得到采样值
  247. 参数:uchar temp  通道选择
  248. *********************************/
  249. float go_1115(uchar temp)
  250. {
  251.   long int result_gd;
  252.   float result_v;
  253.   Confige1115(temp);
  254.   delay_ms(5);
  255.   result_gd=read1115();
  256.   delay_ms(5);
  257.   result_v=result_gd/7999.755859;//转化为电压值,单位为v   
  258.                                   //有正有负,最高位为符号位,单位量值=32768/4.096 V-1
  259.   return result_v;
  260. }
  261. /*********************************
  262. 函数名:sample
  263. 参数:int a采样次数,uchar tep通道选择
  264.       tep=0为通道0和通道1的差分输入
  265. 功能:进行a次采样,且去掉最大最小值求平均
  266. *************************************/
  267. float sample(int a,uchar tep)            //连续采样,  ,采样算法
  268. {                                        //去掉最大最小值求平均值
  269. int i,j;
  270. float max,min,v_out,c=0;
  271. max=min=go_1115(tep);
  272.   for(i=0;i<=9;i++)
  273.   {
  274.    for(j=0;j<=4;j++)
  275.    {
  276.      v_out=go_1115(tep);
  277.    if(v_out>max)     //找出最值
  278.    {max=v_out;}
  279.    if(v_out<min)
  280.    {min=v_out;}
  281.    c=c+v_out;//全部加,到最后减掉最值
  282.    }
  283.    if(j<=5)   
  284.      c=c-max-min;     //去掉最大最小
  285. }
  286.     c=c/30;   
  287.   //每5次采样为一组,每次保留每组中的除去最大最小值的3个值之和
  288.   //一共采样次数为5*10-2*10=30次
  289.     return c;
  290. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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