找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机风力发电机迎风面对风向的追踪系统设计 含电路原理图、程序源码

  [复制链接]
跳转到指定楼层
楼主
这是我做的一个追踪系统
包含两部分测量显示部分和电机驱动部分
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


用proteus画的仿真原理图,还有仿真结果。

八位开关模拟八位二进制编码盘角度精度360/2^8=1.40625度

显示电路选用数码管动态扫描显示,显示角度-180~+180度


000000000000000000000000000000000


电机驱动用于接收单片机正负旋转信号,驱动电机正反转


单片机源程序如下:
  1. #include "reg51.h"

  2. sbit M1=P2^6;
  3. sbit M2=P2^7;
  4. sbit P20=P2^0;
  5. sbit P21=P2^1;
  6. sbit P22=P2^2;
  7. sbit P23=P2^3;
  8. sbit P24=P2^4;

  9. unsigned int table[10]={                        
  10.                                                 0xC0, //"0"
  11.                                                 0xF9, //"1"
  12.                                                 0xA4, //"2"
  13.                                                 0xB0, //"3"
  14.                                                 0x99, //"4"
  15.                                                 0x92, //"5"
  16.                                                 0x82, //"6"
  17.                                                 0xF8, //"7"
  18.                                                 0x80, //"8"
  19.                                                 0x90, //"9"
  20.          };

  21. float Angle,jiaodu;

  22. void Sys_Init()           //端口初始电平
  23. {
  24.         P0=0XFF;
  25.         P1=0XFF;
  26.         P2=0Xe0;
  27. }

  28. float Read_Data()        //从P1口读四位二进制码,转化为角度值
  29. {
  30.         unsigned int y=0;
  31.         float x=0.0;
  32.         y=0XFF^P1;
  33.         x=y*1.4;
  34.         return x;
  35. }
  36. void Delay10ms()                  //延时函数
  37. {
  38.         unsigned char i, j;

  39.         i = 20;
  40.         j = 113;
  41.         do
  42.         {
  43.                 while (--j);
  44.         } while (--i);
  45. }

  46. void Display()                                //显示函数
  47. {
  48.         unsigned int i;
  49.         unsigned  B,C,D,E;
  50.     //        A=Angle/1000;                           //千位
  51.     if(jiaodu>180)
  52.         Angle=360.0-jiaodu;
  53.         else Angle=jiaodu;
  54.         B=(((int)Angle)%1000)/100;                   //百位
  55.         C=((int)Angle)%100/10;                           //十位
  56.         D=((int)Angle)%10;                                   //个位
  57.         E=((int)(jiaodu*10))%10;                   //十分位
  58.         for(i=0;i<5;i++)
  59.         {
  60.                 switch(i)
  61.                 {   
  62.                         case 0:
  63.                                         P20=1;                           //位选端打开
  64.                                         if(jiaodu>180)
  65.                                           P0=0xBF;               //向P0口输数据
  66.                                         else P0=0xC0;
  67.                                         Delay10ms();           //延时
  68.                                         P20=0;                           //位选端关闭               
  69.                                         break;
  70.                         case 1:
  71.                                         P21=1;
  72.                                         P0=table[B];
  73.                                         Delay10ms();        
  74.                                         P21=0;
  75.                                         break;
  76.                         case 2:
  77.                                         P22=1;
  78.                                         P0=table[C];
  79.                                         Delay10ms();        
  80.                                         P22=0;
  81.                                         break;
  82.                         case 3:
  83.                                         P23=1;
  84.                                         P0=table[D];
  85.                                         Delay10ms();        
  86.                                         P23=0;
  87.                                         break;
  88.                         case 4:
  89.                                         P24=1;
  90.                                         P0=table[E];
  91.                                         Delay10ms();        
  92.                                         P24=0;
  93.                                         break;
  94.                         default:
  95.                                         break;
  96.                 }
  97.         }
  98. }        

  99. void Motor_Ctrl()                                 //步进电机脉冲
  100. {
  101.         if(jiaodu<=180)                                 //角度小于180度P26输出一个脉冲
  102.                 {
  103.                         M1=0;
  104.                         M2=1;
  105.                     Delay10ms();
  106.                     M1=1;
  107.                 }
  108.         else if(jiaodu>180)                          //角度大于180度P27输出脉冲
  109.                 {
  110.                         M1=1;
  111.                         M2=0;
  112.                         Delay10ms();
  113.                     M2=1;
  114.                 }
  115.         else
  116.                 {
  117.                         M1=1;
  118.                         M2=1;
  119.                 }
  120. }

  121. void main()                                  //主函数
  122. {
  123.                 Sys_Init();
  124.         while(1)
  125.         {
  126.                 jiaodu=Read_Data();
  127.                 Motor_Ctrl();
  128.                 Display();
  129.         }
  130. }
复制代码


全部资料51hei下载地址:
课程设计.zip (30.2 KB, 下载次数: 94)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:154015 发表于 2019-4-12 23:49 | 只看该作者
电路图打不开呀
回复

使用道具 举报

板凳
ID:498548 发表于 2019-4-17 01:21 | 只看该作者
camelli 发表于 2019-4-12 23:49
电路图打不开呀

用proteus8以上版本试试
回复

使用道具 举报

地板
ID:513536 发表于 2019-4-17 10:52 来自手机 | 只看该作者
谢谢楼主分享,最近有这方面想法
回复

使用道具 举报

5#
ID:375322 发表于 2019-11-6 22:19 | 只看该作者
电路图打不开
回复

使用道具 举报

6#
ID:385637 发表于 2019-11-7 16:38 | 只看该作者
请问这个是通过什么原理测量风的角度的呢?
回复

使用道具 举报

7#
ID:408100 发表于 2020-5-12 15:51 来自手机 | 只看该作者
楼主还在吗,问一下,风力发电机在proteus怎么找啊
回复

使用道具 举报

8#
ID:896604 发表于 2021-4-16 13:55 | 只看该作者
楼主,你这个运行会出现[SPICE] TRAN:  Timestep too small; timestep = 1.25e-019: trouble with node #00007.
的问题,无法运行啊
回复

使用道具 举报

9#
ID:896604 发表于 2021-4-16 14:56 | 只看该作者
楼主你好,这个程序我用protues8.9跑了一下报错了,说[SPICE] TRAN:  Timestep too small; timestep = 1.25e-019: trouble with node #00007.
请问这是需要设置别的什么才能运行吗
回复

使用道具 举报

10#
ID:366464 发表于 2021-4-28 00:18 来自手机 | 只看该作者
风力发电机有尾翼追风!
回复

使用道具 举报

11#
ID:197229 发表于 2021-4-28 10:54 | 只看该作者
zuiqf1978 发表于 2021-4-28 00:18
风力发电机有尾翼追风!

说得不错咯,但是可以举一反三,应用到其他控制,也是移植啊。
回复

使用道具 举报

12#
ID:999277 发表于 2022-1-3 08:37 | 只看该作者
谭擎苍 发表于 2021-4-16 14:56
楼主你好,这个程序我用protues8.9跑了一下报错了,说[SPICE] TRAN:  Timestep too small; timestep = 1.25 ...

我也是,请问您解决了吗
回复

使用道具 举报

13#
ID:489394 发表于 2023-5-10 14:44 | 只看该作者
一样,用protues8.9跑了一下报错了,说[SPICE] TRAN:  Timestep too small; timestep = 1.25e-019: trouble with node #00007.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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