迪文科技论坛

 找回密码
 立即注册
搜索
查看: 53|回复: 0

【分享】2024年实训(2021级“原农瓦”小组分享+基于迪文屏)

[复制链接]

0

主题

0

回帖

47

积分

新手上路

Rank: 1

积分
47
发表于 2024-9-10 21:50:18 | 显示全部楼层 |阅读模式
一、引言
步入新时代,科技在不断发展,科技是第一生产力我们组以现如今的新能源电车的电车系统为灵感,发散思想从特斯拉的屏幕换档,引出通过屏幕来控制扇叶的角度。
二、功能介绍
步进电机:一种电动机它将电脉冲转换为机械角度移动。步进电机的特点是每次接收到一个脉冲信号,就会转动一个固定的角度,称为“步距角”。这种特性使得步进电机非常适合需要精确位置控制的应用。
步进电机具有以下功能特点:
自动调节:步进电机通过接收来自控制系统的信号,自动调整扇叶的角度。控制系统会根据风速、风向、温度、发电效率等多种参数,计算出最优的扇叶角度。
精确控制:步进电机可以非常精确地控制扇叶的旋转角度,实现微调。这使得风力发电机能够更有效地捕获风能,提高发电效率。
三、硬件介绍
系统由EKT043E开发板、T5L芯片、步进电机、线材等组成。
四、界面设计
基于迪文软件DGUS进行页面开发,设计开屏动画、扇叶开机、扇叶速度调节功能等界面

五、代码设计
#include "screen.h"
#include "uart4.h"
#include "norflash.h"
u16 cur_scan_val[8];
bit is_addr_scan = 0;//是否要进行变量地址扫描        
bit flag_0 = 0;
bit flag_180 = 0;
void screen_init(void)
{
memset(cur_scan_val,0,sizeof(cur_scan_val));
}
//变量地址扫描函数
void val_addr_scan(void)
{
                #define ADDR_SCAN_PERIOD 25   //时间间隔
                static idata u16 tick = 0;
                tick++;
                if(tick==ADDR_SCAN_PERIOD)
                {
                        tick = 0;
                        is_addr_scan = 1;
                }
}
//变量地址数据处理函数
void val_addr_handler(void)
{
                #define  VAL_START_ADDR                0x3000
                if(is_addr_scan==0)//是否有扫描信号,没有的话就啥也不做,直接返回
                {
                        return;
                }
                is_addr_scan=0;//清除
                //1.获得增量变量的数值
                sys_read_vp(VAL_START_ADDR,(u8*)&cur_scan_val,8);//返回字
                //uart4_send_byte((u8)cur_scan_val);
               
                                 if(cur_scan_val[0])
                                 {
           motor_rotate(0);
                                         lab_pop_clear(0,0);                                         
                                 }        
                                 if(cur_scan_val[1])
                                 {
                                   motor_rotate(1);
                                   lab_pop_clear(1,0);        
                                 }
                                 if(cur_scan_val[2])
                                 {
                                   motor_rotate(2);
                                   lab_pop_clear(2,0);        
                                 }
          motor_speed_get();
    indicate_LED();                                 
}
void lab_pop_clear(u16 n,u16 temp)
{
        sys_write_vp(0x3000+n,(u8*)&temp,1);        
}
void motor_rotate(u8 mode_or_FreeInput)
{
        u16 angle_absolute = 0;
        
        u16 last_angle_absolute = 0;
        u16 angle_rotate = 0;
        
        if(mode_or_FreeInput == 0)
        {
        sys_read_vp(ANGLE_ADDR,(u8*)&angle_absolute,1);//自由输入模式
        }
        norflash_read(FLASH_ADDR,(u8*)&last_angle_absolute,2);
        
        if(mode_or_FreeInput == 1)
        {
        speed = 2;
        angle_absolute = 30;//睡眠模式
        }
        if(mode_or_FreeInput == 2)
        {
        speed = 2;
        angle_absolute = 90;//直吹模式
        }
        
        if(angle_absolute > last_angle_absolute)
        {
               
        angle_rotate = angle_absolute - last_angle_absolute;
               
  motor_direction =0;//顺时针旋转
  beats_calculate((u32)angle_rotate);
  norflash_write(FLASH_ADDR,(u8*)&angle_absolute,2);
        
        }
        else
        {
               
        angle_rotate = last_angle_absolute - angle_absolute;
        
        motor_direction =1;//逆时针旋转
  beats_calculate((u32)angle_rotate);
  norflash_write(FLASH_ADDR,(u8*)&angle_absolute,2);
        
        }
        
        
        if(angle_absolute == 0)
        {
        flag_0 = 1;
        }else
        {
        flag_0 = 0;
        }
        
        if(angle_absolute == 180)
        {
        flag_180 = 1;        
        }else
        {
        flag_180 = 0;
        }          
}
void indicate_LED(void)
{
if((flag_0 == 1) && (stop_flag ==1))
{
  P1 |=(0x01<<6);        
}else
{
  P1 &=~(0x01<<6);
}
if((flag_180 == 1) && (stop_flag ==1))
{
  P1 |=(0x01<<7);
}else
{
P1 &=~(0x01<<7);
}
}        
void motor_speed_get(void)
{
        u8 n;
  for(n=0;n<5;n++)
        {
        if(cur_scan_val[3+n])
        {
        speed = n+1;
        lab_pop_clear(3+n,0);
        
        }
        }

}
六、接口连接
P2.0,P2.1,P2.2 P2.3四个引脚分别连接1234,,再将2根电源线连接,其中正极接迪文板上的5U孔,负极接GND孔,从而实现空调扇叶的开合功能。。
七、系统实现与测试
代码经过keil5进行编译,显示0 Error,0 Warning。上屏显示正常,测试成功,讲解录制视频已上传。
(如有问题请私信我)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-23 06:00 , Processed in 0.171706 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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