找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32随光追光系统的源码+视频

  [复制链接]
跳转到指定楼层
楼主
视频在B站,链接如下,大家有喜欢的可以去看看,现在开放源代码。STM32F103ZET6芯片。
视频地址:https://www.bilibili.com/video/av68476662
视频地址:https://www.bilibili.com/video/av66018630

这个是校光伏大赛比赛的一个作品
旨在万物互联,万物联网。

加入电压采集功能,实时传给电脑端的LORA
加入角度测量模块

单片机源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "timer4.h"
  5. #include "adc.h"
  6. #include "oled.h"
  7. #include "lora_app.h"
  8. #include "lora_ui.h"
  9. #include "usart3.h"
  10. #include "string.h"
  11. #include "stdio.h"
  12. #include "timer.h"
  13. #include "rtc.h"
  14. //d12 d13 d14 d15
  15. #define N 200
  16. #define M 50
  17. #define deat_speed 50
  18. #define pwm_min 1749
  19. #define pwm_mid 1849
  20. #define pwm_max 1949
  21. #define pwm_sum 3698
  22. u16 x = 0,y = 0,z = 0;
  23. u16 ADC = 0;
  24. u8 t=0;
  25. float vote = 0.0;
  26. u16 up_a,up_b;
  27. u16 down_a,down_b;
  28. u8 i,j,min_up=0,min_down=0,min_UP=0;
  29. u16 up_date[N];
  30. u16 down_date[M];
  31. void delay_min(u8 n,u8 sent_up,u8 sent_down);
  32. void time_display(void);
  33. int main(void)
  34. {
  35.     uart_init(115200);
  36.     delay_init();
  37.     OLED_Init();
  38.     RTC_Init();                                  //RTC初始化
  39.     TIM4_PWM_Init(1999,719);//50khz
  40.     Adc_Init();
  41.     LoRa_Init();
  42.     LoRa_Set();//LoRa配置(进入配置需设置串口波特率为115200)
  43.     while(1)
  44.     {
  45.         //1号归位
  46.         //2号固定45度
  47.         TIM_SetCompare1(TIM4,pwm_min);
  48.         TIM_SetCompare2(TIM4,1810);
  49.         delay_ms(200);
  50.         //1号开始检测
  51.         up_b = 0;
  52.         up_a = 0;
  53.         for(; up_a < N; up_a += 2) //200脉冲单位,检测100次
  54.         {
  55.             TIM_SetCompare1(TIM4,pwm_min + up_a);//舵机转180度
  56.             delay_ms(deat_speed);
  57.             up_date[up_b] = (Get_Adc_Average(ADC_Channel_0,1));
  58.             up_b ++;
  59.         }
  60.         //1号归位
  61.         //2号固定135度
  62.         TIM_SetCompare1(TIM4,pwm_max);
  63.         TIM_SetCompare2(TIM4,1890);
  64.         delay_ms(500);
  65.         //1号开始检测
  66.         up_b = 100;
  67.         up_a = N;
  68.         for(; up_a > 0; up_a -= 2) //200脉冲单位,检测100次
  69.         {
  70.             TIM_SetCompare1(TIM4,pwm_min + up_a);//舵机转180度
  71.             delay_ms(deat_speed);
  72.             up_date[up_b] = (Get_Adc_Average(ADC_Channel_0,1));
  73.             up_b ++;
  74.         }
  75.         //找最大值
  76.         for(j = 1; j < N - 1; j ++)
  77.         {
  78.             if(up_date[j + 1] < up_date[min_UP])
  79.             {
  80.                 min_UP = j + 1;
  81.             }
  82.             else
  83.             {
  84.                 j +=1;
  85.             }
  86.         }
  87.         //判断min_up在哪边
  88.         if(min_UP < 100)
  89.         {
  90.             min_up = min_UP;
  91.             TIM_SetCompare1(TIM4,min_up * 2 + pwm_min);
  92.             TIM_SetCompare2(TIM4,pwm_mid);
  93.             delay_ms(500);
  94.             //2号舵机上下
  95.             down_b = 0;
  96.             down_a = 100;
  97.             for(; down_a > 0; down_a -=2)
  98.             {
  99.                 TIM_SetCompare2(TIM4,pwm_min + down_a);
  100.                 delay_ms(deat_speed);
  101.                 down_date[down_b] = (Get_Adc_Average(ADC_Channel_0,1));
  102.                 down_b ++;
  103.             }
  104.             //找最大值
  105.             for(i = 1; i < M - 1; i ++)
  106.             {
  107.                 if(down_date[i + 1] < down_date[min_down])
  108.                 {
  109.                     min_down = i + 1;
  110.                 }
  111.                 else
  112.                 {
  113.                     i +=1;
  114.                 }
  115.             }
  116.             //算出最大值所在的平面坐标
  117.             TIM_SetCompare2(TIM4,min_down * (-2) + pwm_mid);
  118.         }
  119.         else
  120.         {
  121.             min_up = N - min_UP;
  122.             //算出最大值所在的平面坐标
  123.             TIM_SetCompare1(TIM4,min_up * 2 + pwm_min);
  124.             TIM_SetCompare2(TIM4,pwm_mid);
  125.             delay_ms(500);
  126.             //2号舵机上下
  127.             down_b = 0;
  128.             down_a = 100;
  129.             for(; down_a > 0; down_a -=2)
  130.             {
  131.                 TIM_SetCompare2(TIM4,pwm_max - down_a);
  132.                 delay_ms(deat_speed);
  133.                 down_date[down_b] = (Get_Adc_Average(ADC_Channel_0,1));
  134.                 down_b ++;
  135.             }
  136.             //找最大值
  137.             for(i = 1; i < M - 1; i ++)
  138.             {
  139.                 if(down_date[i + 1] < down_date[min_down])
  140.                 {
  141.                     min_down = i + 1;
  142.                 }
  143.                 else
  144.                 {
  145.                     i +=1;
  146.                 }
  147.             }
  148.             //算出最大值所在的平面坐标
  149.             TIM_SetCompare2(TIM4,min_down * 2 + pwm_mid);

  150.         }

  151.         OLED_16x16CN(0,0,up_date[min_UP] / 1000);
  152.         OLED_16x16CN(9,0,up_date[min_UP] / 100 % 10);
  153.         OLED_16x16CN(18,0,up_date[min_UP] / 10 % 10);
  154.         OLED_16x16CN(27,0,up_date[min_UP] % 10);
  155.         OLED_16x16CN(0,2,down_date[min_down] / 1000);
  156.         OLED_16x16CN(9,2,down_date[min_down] / 100 % 10);
  157.         OLED_16x16CN(18,2,down_date[min_down] / 10 % 10);
  158.         OLED_16x16CN(27,2,down_date[min_down] % 10);
  159.         OLED_16x16CN(0,4,min_UP / 100);
  160.         OLED_16x16CN(9,4,min_UP / 10 % 10);
  161.         OLED_16x16CN(18,4,min_UP % 10);
  162.         OLED_16x16CN(32,4,min_down / 10);
  163.         OLED_16x16CN(40,4,min_down % 10);
  164.         //发送数据
  165.         if(!LORA_AUX)//若空闲
  166.         {
  167.             LoRa_SendData(min_UP,min_down);//发送数据
  168.         }
  169.                 time_display();        //调试部分
  170. //        while(1)
  171. //        {
  172. //            int hhh;
  173. //            hhh ++;
  174. //        }
  175.         delay_min(15,min_UP,min_down);
  176.     }
  177. }

  178. void delay_min(u8 n,u8 sent_up,u8 sent_down)
  179. {
  180.     for(y = 0; y < n; y ++)
  181.     {
  182.         for(x = 0; x < 30; x ++)
  183.         {
  184.             delay_ms(500);
  185.             delay_ms(500);
  186.             delay_ms(500);
  187.             delay_ms(500);
  188.             //调试
  189.             //采集光伏板电压
  190.             ADC = (int)((Get_Adc_Average(ADC_Channel_1,1)));//A1
  191.             //转换为电压
  192.             vote = 2 * ADC / 1262.0;
  193. //                        printf("LIGHT = %f /ADC\r\n",vote);
  194.             if(!LORA_AUX)//若空闲
  195.             {
  196.                 LoRa_SendData(sent_up,sent_down);//发送数据
  197.                 LoRa_SendData_v(vote * 10);
  198.             }
  199.         }
  200.     }
  201. }



  202. void time_display(void)
  203. {
  204.     if(t!=calendar.sec)
  205.     {
  206.         t=calendar.sec;
  207. //        年
  208.         OLED_16x16CN(0,6,calendar.w_year / 10 % 10);
  209.         OLED_16x16CN(8,6,calendar.w_year % 10);
  210.         OLED_16x16CN(16,6,11);
  211. //    月
  212.         OLED_16x16CN(24,6,calendar.w_month / 10 % 10);
  213.         OLED_16x16CN(32,6,calendar.w_month % 10);
  214.         OLED_16x16CN(40,6,11);
  215. //        日
  216.         OLED_16x16CN(48,6,calendar.w_date / 10 %10);
  217.         OLED_16x16CN(56,6,calendar.w_date % 10);
  218.         OLED_16x16CN(64,6,11);
  219.         switch(calendar.week)
  220.         {
  221.         case 0:
  222.             OLED_16x16CN(72,6,7);
  223. ……………………

  224. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
9-21.7z (1.36 MB, 下载次数: 134)

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

使用道具 举报

沙发
ID:586372 发表于 2019-12-24 11:14 | 只看该作者
能用51吗
回复

使用道具 举报

板凳
ID:144104 发表于 2020-3-25 15:41 | 只看该作者
正好需要,感谢分享!
回复

使用道具 举报

地板
ID:988221 发表于 2022-9-19 20:24 | 只看该作者
视频里的什么电机啊,型号
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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