注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

bqgup的个人空间 http://home.eeworld.com.cn/space-uid-1014845.html [收藏] [复制] [分享] [RSS]

日志

DIY可追踪太阳的太阳能电池板

已有 132 次阅读2018-9-13 10:29 |个人分类:技术学习

可追踪太阳的太阳能电池板设计
1、选取可追踪太阳的太阳能电池板执行机构
减速比(减速比=输入转速÷输出转速=从动齿轮齿数÷主动齿轮齿                         ):64
步距角:5.625度(64个脉冲一圈)       
作用:通过输入的脉冲数,确定旋转的角位移,一般来控制小车轮子                的偏移角度等。
驱动方式:48(正转A-AB-B-BC-C-CD-D-DA-A......)
步进电机的相励磁的相励顺序:
步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)
2、开始在步进电机上搭载太阳能板
3、安装光照强度传感器模块
光照强度模块我选择的是BH1750模块,BH1750是一种IIC工作器件,我通过他采集光照强度,将数据反馈给步进电机,来使太阳能板调整方向追踪光照强度大的方向。
4、模块化程序
因为我做的系统比较大,为了使程序清晰条理,我使用模块化编程,下面是步进电机程序:
  1. #ifndef __STEPMOTOR_H
  2. #define __STEPMKOTOR_H

  3. #include

  4. void Stepmotor_Angle(unsigned int angle, unsigned char dir,unsigned char speed);
  5. void Stepmotor_Stop(void);
  6. void Stepmotor_Delayms(unsigned int x);
  7. #endif

  8. #include "stepmotor.h"

  9. code const unsigned char CCW[8] = {0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//顺时针旋转

  10. code const unsigned char        CW[8] = {0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//逆时针旋转


  11. void Stepmotor_Delayms(unsigned int x)
  12. {
  13.         unsigned char y;

  14.         for( ; x > 0; x--)
  15.         {
  16.                 for(y = 110; y > 0; y--);
  17.         }
  18. }




  19. /***********************************************************************
  20. *函数名称;        Step_Motor
  21. *函数参数:        dir:方向位:dir = 0顺时针转,dir = 1逆时针转
  22.                         speed:
  23.                                         4:最快
  24.                                         10:最慢
  25.                                         其他速度自涸?~10之间选择合适的速度
  26. *函数功能:        步进电机按一定的方向转动
  27. *返 回 值:        无
  28. *函数作者:bqgup
  29. *完成日期:2017.9.12
  30. ************************************************************************/
  31. static void Step_Motor(unsigned char dir,unsigned char speed)
  32. {
  33.         unsigned char i,j;

  34.         for(j = 0; j < 8; j++)
  35.         {
  36.                
  37.                
  38.                 for(i = 0; i < 8; i++)
  39.                 {
  40.                         if(dir == 0)
  41.                         {
  42.                                 P1 = CCW[i];
  43.                         }

  44.                         else if(dir == 1)
  45.                         {
  46.                                 P1 = CW[i];
  47.                         }
  48.                         Stepmotor_Delayms(speed);//最慢7档
  49.                 }               
  50.         }       
  51. }

  52. /***********************************************************************
  53. *函数名称;        Stepmotor_Angle
  54. *函数参数:        angle:角度dir:方向dir = 0顺时针转,dir = 1逆时针转
  55.                 speed:旋转速度,从4往上加,数值越大,速度越慢,注意不能超过数据类型的规定大小
  56. *函数功能:        步进电机按一定的方向转动一定的角度
  57. *返 回 值:        无
  58. *函数作者:        bqgup
  59. *完成日期:2017.9.12
  60. ************************************************************************/
  61. void Stepmotor_Angle(unsigned int angle, unsigned char dir,unsigned char speed)
  62. {
  63.         unsigned int pulse;

  64.         unsigned int i;

  65.         pulse = angle / 11.25 + 0.5;

  66.         for(i = pulse; i > 0; i--)
  67.         {
  68.                 Step_Motor(dir,speed);
  69.         }
  70. }

  71. void Stepmotor_Stop(void)
  72. {
  73.         P1 = 0x00;
  74. }
复制代码


下面再附上BH1750光照强度模块采集程序
  1. #ifndef BH1750_H
  2. #define BH1750_H

  3. #include
  4. #include

  5. #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  6.                           //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
  7. sbit SCL=P1^2;            //IIC时钟引脚定义
  8. sbit SDA=P1^3;            //IIC数据引脚定义
  9. /**********************************************************************
  10. *函数名称:        delay_nms
  11. *函数功能:        延迟xms
  12. *函数参数:         x
  13. *返 回 值:        无
  14. ***********************************************************************/
  15. void delay_nms(unsigned int x);
  16. /**********************************************************************
  17. *函数名称:        BH1750_Start
  18. *函数功能:        I2c总线起始信号
  19. *函数参数:         无
  20. *返 回 值:        无
  21. ***********************************************************************/
  22. void BH1750_Start();
  23. /**********************************************************************
  24. *函数名称:        BH1750_Stop
  25. *函数功能:        I2c总线终止信号
  26. *函数参数:         无
  27. *返 回 值:        无
  28. ***********************************************************************/
  29. void BH1750_Stop();
  30. /**********************************************************************
  31. *函数名称:         BH1750_SendACK
  32. *函数功能:        I2c总线发送应答信号
  33. *函数参数:         ack
  34. *返 回 值:        无
  35. ***********************************************************************/
  36. void BH1750_SendACK(bit ack);
  37. /**********************************************************************
  38. *函数名称:        BH1750_RecvACK
  39. *函数功能:        I2c总线接收应答信号
  40. *函数参数:         无
  41. *返 回 值:        CY
  42. ***********************************************************************/
  43. bit BH1750_RecvACK();
  44. /**********************************************************************
  45. *函数名称:  BH1750_SendByte
  46. *函数功能:        I2c总线写一个字节
  47. *函数参数:         无
  48. *返 回 值:        无
  49. ***********************************************************************/
  50. void BH1750_SendByte(unsigned char dat);
  51. /**********************************************************************
  52. *函数名称:  BH1750_RecvByte
  53. *函数功能:        I2c总线读一个字节
  54. *函数参数:         无
  55. *返 回 值:        dat
  56. ***********************************************************************/
  57. unsigned char BH1750_RecvByte();
  58. /**********************************************************************
  59. *函数名称:  Single_Write_BH1750
  60. *函数功能:        BH1750单字节写入
  61. *函数参数:         无
  62. *返 回 值:        无
  63. ***********************************************************************/
  64. void Single_Write_BH1750(unsigned char REG_Address);
  65. /**********************************************************************
  66. *函数名称:  Single_Read_BH1750
  67. *函数功能:        BH1750单字节读取
  68. *函数参数:         无
  69. *返 回 值:        无
  70. ***********************************************************************/
  71. //unsigned char Single_Read_BH1750(uchar REG_Address);
  72. /**********************************************************************
  73. *函数名称:  Init_BH1750
  74. *函数功能:        BH1750初始化
  75. *函数参数:         无
  76. *返 回 值:        无
  77. ***********************************************************************/
  78. void Init_BH1750();
  79. #endif


  80. #include "bh1750.h"
  81. /**********************************************************************
  82. *函数名称:        delay_nms
  83. *函数功能:        延迟xms
  84. *函数参数:         x
  85. *返 回 值:        无
  86. ***********************************************************************/
  87. void delay_nms(unsigned int x)       
  88. {                                               
  89.   unsigned int y;                               
  90.   for(; x > 0; x--)
  91.    {                       
  92.      for(y = 110; y > 0; y--);                       
  93.    }                                               
  94. }
  95. /**********************************************************************
  96. *函数名称:        Delay5us
  97. *函数功能:        延迟5us
  98. *函数参数:         无
  99. *返 回 值:        无
  100. ***********************************************************************/
  101. void Delay5us()
  102. {
  103.     _nop_();_nop_();_nop_();_nop_();
  104.     _nop_();_nop_();_nop_();_nop_();
  105.         _nop_();_nop_();_nop_();_nop_();
  106.         _nop_();_nop_();_nop_();_nop_();
  107. }
  108. /**********************************************************************
  109. *函数名称:        BH1750_Start
  110. *函数功能:        I2c总线起始信号
  111. *函数参数:         无
  112. *返 回 值:        无
  113. ***********************************************************************/
  114. void BH1750_Start()
  115. {
  116.     SDA = 1;                    //拉高数据线
  117.     SCL = 1;                    //拉高时钟线
  118.     Delay5us();                 //延时
  119.     SDA = 0;                    //产生下降沿
  120.     Delay5us();                 //延时
  121.     SCL = 0;                    //拉低时钟线
  122. }
  123. /**********************************************************************
  124. *函数名称:        BH1750_Stop
  125. *函数功能:        I2c总线终止信号
  126. *函数参数:         无
  127. *返 回 值:        无
  128. ***********************************************************************/
  129. void BH1750_Stop()
  130. {
  131.     SDA = 0;                    //拉低数据线
  132.     SCL = 1;                    //拉高时钟线
  133.     Delay5us();                 //延时
  134.     SDA = 1;                    //产生上升沿
  135.     Delay5us();                 //延时
  136. }
  137. /**********************************************************************
  138. *函数名称:         BH1750_SendACK
  139. *函数功能:        I2c总线发送应答信号
  140. *函数参数:         ack
  141. *返 回 值:        无
  142. ***********************************************************************/
  143. void BH1750_SendACK(bit ack)
  144. {
  145.     SDA = ack;                  //写应答信号
  146.     SCL = 1;                    //拉高时钟线
  147.     Delay5us();                 //延时
  148.     SCL = 0;                    //拉低时钟线
  149.     Delay5us();                 //延时
  150. }

  151. /**********************************************************************
  152. *函数名称:        BH1750_RecvACK
  153. *函数功能:        I2c总线接收应答信号
  154. *函数参数:         无
  155. *返 回 值:        CY
  156. ***********************************************************************/
  157. bit BH1750_RecvACK()
  158. {
  159.     SCL = 1;                    //拉高时钟线
  160.     Delay5us();                 //延时
  161.     CY = SDA;                   //读应答信号
  162.     SCL = 0;                    //拉低时钟线
  163.     Delay5us();                 //延时

  164.     return CY;
  165. }

  166. /**********************************************************************
  167. *函数名称:  BH1750_SendByte
  168. *函数功能:        I2c总线写一个字节
  169. *函数参数:         无
  170. *返 回 值:        无
  171. ***********************************************************************/
  172. void BH1750_SendByte(unsigned char dat)
  173. {
  174.     unsigned char i;

  175.     for (i=0; i<8; i++)         //8位计数器
  176.     {
  177.         dat <<= 1;              //移出数据的最高位
  178.         SDA = CY;               //送数据口
  179.         SCL = 1;                //拉高时钟线
  180.         Delay5us();             //延时
  181.         SCL = 0;                //拉低时钟线
  182.         Delay5us();             //延时
  183.     }
  184.     BH1750_RecvACK();
  185. }

  186. /**********************************************************************
  187. *函数名称:  BH1750_RecvByte
  188. *函数功能:        I2c总线读一个字节
  189. *函数参数:         无
  190. *返 回 值:        dat
  191. ***********************************************************************/
  192. unsigned char BH1750_RecvByte()
  193. {
  194.     unsigned char i;
  195.     unsigned char dat = 0;

  196.     SDA = 1;                    //使能内部上拉,准备读取数据,
  197.     for (i=0; i<8; i++)         //8位计数器
  198.     {
  199.         dat <<= 1;
  200.         SCL = 1;                //拉高时钟线
  201.         Delay5us();             //延时
  202.         dat |= SDA;             //读数据               
  203.         SCL = 0;                //拉低时钟线
  204.         Delay5us();             //延时
  205.     }
  206.     return dat;
  207. }
  208. /**********************************************************************
  209. *函数名称:  Single_Write_BH1750
  210. *函数功能:        BH1750单字节写入
  211. *函数参数:         无
  212. *返 回 值:        无
  213. ***********************************************************************/
  214. void Single_Write_BH1750(unsigned char REG_Address)
  215. {
  216.     BH1750_Start();                  //起始信号
  217.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
  218.     BH1750_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
  219.   //BH1750_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
  220.     BH1750_Stop();                   //发送停止信号
  221. }
  222. /**********************************************************************
  223. *函数名称:  Single_Read_BH1750
  224. *函数功能:        BH1750单字节读取
  225. *函数参数:         无
  226. *返 回 值:        无
  227. ***********************************************************************/
  228. /*
  229. unsigned char Single_Read_BH1750(uchar REG_Address)
  230. {  unsigned char REG_data;
  231.     BH1750_Start();                          //起始信号
  232.     BH1750_SendByte(SlaveAddress);           //发送设备地址+写信号
  233.     BH1750_SendByte(REG_Address);                   //发送存储单元地址,从0开始       
  234.     BH1750_Start();                          //起始信号
  235.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  236.     REG_data=BH1750_RecvByte();              //读出寄存器数据
  237.         BH1750_SendACK(1);   
  238.         BH1750_Stop();                           //停止信号
  239.     return REG_data;
  240. }
  241. */
  242. /**********************************************************************
  243. *函数名称:  Init_BH1750
  244. *函数功能:        BH1750初始化
  245. *函数参数:         无
  246. *返 回 值:        无
  247. ***********************************************************************/
  248. void Init_BH1750()
  249. {
  250.    Single_Write_BH1750(0x01);  
  251. }


  252. void BH1750_DataAlter(unsigned int temp_data)  //  数据转换出 个,十,百,千,万
  253. {  
  254.     wan=temp_data/10000+0x30 ;
  255.     temp_data=temp_data%10000;   //取余运算
  256.         qian=temp_data/1000+0x30 ;
  257.     temp_data=temp_data%1000;    //取余运算
  258.     bai=temp_data/100+0x30   ;
  259.     temp_data=temp_data%100;     //取余运算
  260.     shi=temp_data/10+0x30    ;
  261.     temp_data=temp_data%10;      //取余运算
  262.     ge=temp_data+0x30;        
  263. }
  264.                        

  265. void Multiple_read_BH1750(void)
  266. {   unsigned char i;       
  267.     BH1750_Start();                          //起始信号
  268.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  269.        
  270.          for (i=0; i<3; i++)                      //连续读取6个地址数据,存储中BUF
  271.     {
  272.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  273.         if (i == 3)
  274.         {

  275.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
  276.         }
  277.         else
  278.         {               
  279.           BH1750_SendACK(0);                //回应ACK
  280.        }
  281.    }

  282.     BH1750_Stop();                          //停止信号
  283.     delay_nms(5);
  284. }

  285. void Disposal_BH1750()
  286. {
  287.   Single_Write_BH1750(0x01);   // power on
  288.     Single_Write_BH1750(0x10);   // H- resolution mode

  289.      delay_nms(180);              //延时180ms

  290.     Multiple_read_BH1750();       //连续读出数据,存储在BUF中
  291. }
复制代码



本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-24 11:26 , Processed in 0.015968 second(s), 10 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2018 http://bbs.eeworld.com.cn/

返回顶部