标题:
STM32随光追光系统的源码+视频
[打印本页]
作者:
QI0609
时间:
2019-12-18 12:25
标题:
STM32随光追光系统的源码+视频
视频在B站,链接如下,大家有喜欢的可以去看看,现在开放源代码。STM32F103ZET6芯片。
视频地址:
https://www.bilibili.com/video/av68476662
视频地址:
https://www.bilibili.com/video/av66018630
这个是校光伏大赛比赛的一个作品
旨在万物互联,万物联网。
加入电压采集功能,实时传给电脑端的LORA
加入角度测量模块
51hei.png
(6.41 KB, 下载次数: 65)
下载附件
2019-12-19 12:54 上传
单片机源程序如下:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer4.h"
#include "adc.h"
#include "oled.h"
#include "lora_app.h"
#include "lora_ui.h"
#include "usart3.h"
#include "string.h"
#include "stdio.h"
#include "timer.h"
#include "rtc.h"
//d12 d13 d14 d15
#define N 200
#define M 50
#define deat_speed 50
#define pwm_min 1749
#define pwm_mid 1849
#define pwm_max 1949
#define pwm_sum 3698
u16 x = 0,y = 0,z = 0;
u16 ADC = 0;
u8 t=0;
float vote = 0.0;
u16 up_a,up_b;
u16 down_a,down_b;
u8 i,j,min_up=0,min_down=0,min_UP=0;
u16 up_date[N];
u16 down_date[M];
void delay_min(u8 n,u8 sent_up,u8 sent_down);
void time_display(void);
int main(void)
{
uart_init(115200);
delay_init();
OLED_Init();
RTC_Init(); //RTC初始化
TIM4_PWM_Init(1999,719);//50khz
Adc_Init();
LoRa_Init();
LoRa_Set();//LoRa配置(进入配置需设置串口波特率为115200)
while(1)
{
//1号归位
//2号固定45度
TIM_SetCompare1(TIM4,pwm_min);
TIM_SetCompare2(TIM4,1810);
delay_ms(200);
//1号开始检测
up_b = 0;
up_a = 0;
for(; up_a < N; up_a += 2) //200脉冲单位,检测100次
{
TIM_SetCompare1(TIM4,pwm_min + up_a);//舵机转180度
delay_ms(deat_speed);
up_date[up_b] = (Get_Adc_Average(ADC_Channel_0,1));
up_b ++;
}
//1号归位
//2号固定135度
TIM_SetCompare1(TIM4,pwm_max);
TIM_SetCompare2(TIM4,1890);
delay_ms(500);
//1号开始检测
up_b = 100;
up_a = N;
for(; up_a > 0; up_a -= 2) //200脉冲单位,检测100次
{
TIM_SetCompare1(TIM4,pwm_min + up_a);//舵机转180度
delay_ms(deat_speed);
up_date[up_b] = (Get_Adc_Average(ADC_Channel_0,1));
up_b ++;
}
//找最大值
for(j = 1; j < N - 1; j ++)
{
if(up_date[j + 1] < up_date[min_UP])
{
min_UP = j + 1;
}
else
{
j +=1;
}
}
//判断min_up在哪边
if(min_UP < 100)
{
min_up = min_UP;
TIM_SetCompare1(TIM4,min_up * 2 + pwm_min);
TIM_SetCompare2(TIM4,pwm_mid);
delay_ms(500);
//2号舵机上下
down_b = 0;
down_a = 100;
for(; down_a > 0; down_a -=2)
{
TIM_SetCompare2(TIM4,pwm_min + down_a);
delay_ms(deat_speed);
down_date[down_b] = (Get_Adc_Average(ADC_Channel_0,1));
down_b ++;
}
//找最大值
for(i = 1; i < M - 1; i ++)
{
if(down_date[i + 1] < down_date[min_down])
{
min_down = i + 1;
}
else
{
i +=1;
}
}
//算出最大值所在的平面坐标
TIM_SetCompare2(TIM4,min_down * (-2) + pwm_mid);
}
else
{
min_up = N - min_UP;
//算出最大值所在的平面坐标
TIM_SetCompare1(TIM4,min_up * 2 + pwm_min);
TIM_SetCompare2(TIM4,pwm_mid);
delay_ms(500);
//2号舵机上下
down_b = 0;
down_a = 100;
for(; down_a > 0; down_a -=2)
{
TIM_SetCompare2(TIM4,pwm_max - down_a);
delay_ms(deat_speed);
down_date[down_b] = (Get_Adc_Average(ADC_Channel_0,1));
down_b ++;
}
//找最大值
for(i = 1; i < M - 1; i ++)
{
if(down_date[i + 1] < down_date[min_down])
{
min_down = i + 1;
}
else
{
i +=1;
}
}
//算出最大值所在的平面坐标
TIM_SetCompare2(TIM4,min_down * 2 + pwm_mid);
}
OLED_16x16CN(0,0,up_date[min_UP] / 1000);
OLED_16x16CN(9,0,up_date[min_UP] / 100 % 10);
OLED_16x16CN(18,0,up_date[min_UP] / 10 % 10);
OLED_16x16CN(27,0,up_date[min_UP] % 10);
OLED_16x16CN(0,2,down_date[min_down] / 1000);
OLED_16x16CN(9,2,down_date[min_down] / 100 % 10);
OLED_16x16CN(18,2,down_date[min_down] / 10 % 10);
OLED_16x16CN(27,2,down_date[min_down] % 10);
OLED_16x16CN(0,4,min_UP / 100);
OLED_16x16CN(9,4,min_UP / 10 % 10);
OLED_16x16CN(18,4,min_UP % 10);
OLED_16x16CN(32,4,min_down / 10);
OLED_16x16CN(40,4,min_down % 10);
//发送数据
if(!LORA_AUX)//若空闲
{
LoRa_SendData(min_UP,min_down);//发送数据
}
time_display(); //调试部分
// while(1)
// {
// int hhh;
// hhh ++;
// }
delay_min(15,min_UP,min_down);
}
}
void delay_min(u8 n,u8 sent_up,u8 sent_down)
{
for(y = 0; y < n; y ++)
{
for(x = 0; x < 30; x ++)
{
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
//调试
//采集光伏板电压
ADC = (int)((Get_Adc_Average(ADC_Channel_1,1)));//A1
//转换为电压
vote = 2 * ADC / 1262.0;
// printf("LIGHT = %f /ADC\r\n",vote);
if(!LORA_AUX)//若空闲
{
LoRa_SendData(sent_up,sent_down);//发送数据
LoRa_SendData_v(vote * 10);
}
}
}
}
void time_display(void)
{
if(t!=calendar.sec)
{
t=calendar.sec;
// 年
OLED_16x16CN(0,6,calendar.w_year / 10 % 10);
OLED_16x16CN(8,6,calendar.w_year % 10);
OLED_16x16CN(16,6,11);
// 月
OLED_16x16CN(24,6,calendar.w_month / 10 % 10);
OLED_16x16CN(32,6,calendar.w_month % 10);
OLED_16x16CN(40,6,11);
// 日
OLED_16x16CN(48,6,calendar.w_date / 10 %10);
OLED_16x16CN(56,6,calendar.w_date % 10);
OLED_16x16CN(64,6,11);
switch(calendar.week)
{
case 0:
OLED_16x16CN(72,6,7);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
9-21.7z
(1.36 MB, 下载次数: 135)
2019-12-19 12:59 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
1069663316
时间:
2019-12-24 11:14
能用51吗
作者:
yuanhong
时间:
2020-3-25 15:41
正好需要,感谢分享!
作者:
DEVIL嗯
时间:
2022-9-19 20:24
视频里的什么电机啊,型号
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1