标题:
UCOSII简易STM32直流电机控制+湿度测量曲线 完整源码
[打印本页]
作者:
FFTT
时间:
2017-3-20 17:17
标题:
UCOSII简易STM32直流电机控制+湿度测量曲线 完整源码
采用UCOSII操作系统的STM32直流电机控制还带湿度测量曲线的功能.
0.png
(59.9 KB, 下载次数: 85)
下载附件
2017-3-20 19:52 上传
完整源码下载:
简易STM32直流电机控制+湿度测量曲线.7z
(289.12 KB, 下载次数: 92)
2022-12-16 04:06 上传
点击文件名下载附件
下载积分: 黑币 -5
主程序:
#include "led.h"
#include "lcd.h"
#include "timer.h"
#include "beep.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
#include "dht11.h"
/////////////////////////UCOSII任务堆栈设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 64
//创建任务堆栈空间
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数接口
void start_task(void *pdata);
//温湿度任务
//设置任务优先级
#define MOTOR_DHT_TASK_PRIO 9
//设置任务堆栈大小
#define MOTOR_DHT_STK_SIZE 64
//创建任务堆栈空间
OS_STK MOTOR_DHT_TASK_STK[MOTOR_DHT_STK_SIZE];
//任务函数接口
void motor_dht_task(void *pdata);
//电机正转任务
//设置任务优先级
#define MOTOR_W_TASK_PRIO 8
//设置任务堆栈大小
#define MOTOR_W_STK_SIZE 64
//创建任务堆栈空间
OS_STK MOTOR_W_TASK_STK[MOTOR_W_STK_SIZE];
//任务函数接口
void motor_w_task(void *pdata);
//电机反转任务
//设置任务优先级
#define MOTOR_AW_TASK_PRIO 7
//设置任务堆栈大小
#define MOTOR_AW_STK_SIZE 64
//创建任务堆栈空间
OS_STK MOTOR_AW_TASK_STK[MOTOR_AW_STK_SIZE];
//任务函数接口
void motor_aw_task(void *pdata);
//电机加速任务
//设置任务优先级
#define MOTOR_AC_TASK_PRIO 6
//设置任务堆栈大小
#define MOTOR_AC_STK_SIZE 64
//创建任务堆栈空间
OS_STK MOTOR_AC_TASK_STK[MOTOR_AC_STK_SIZE];
//任务函数接口
void motor_ac_task(void *pdata);
//电机减速任务
//设置任务优先级
#define MOTOR_DE_TASK_PRIO 5
//设置任务堆栈大小
#define MOTOR_DE_STK_SIZE 64
//创建任务堆栈空间
OS_STK MOTOR_DE_TASK_STK[MOTOR_DE_STK_SIZE];
//任务函数接口
void motor_de_task(void *pdata);
//主任务
//设置任务优先级
#define MAIN_TASK_PRIO 4
//设置任务堆栈大小
#define MAIN_STK_SIZE 128
//创建任务堆栈空间
OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
//任务函数接口
void main_task(void *pdata);
//按键扫描任务
//设置任务优先级
#define KEY_TASK_PRIO 3
//设置任务堆栈大小
#define KEY_STK_SIZE 64
//创建任务堆栈空间
OS_STK KEY_TASK_STK[KEY_STK_SIZE];
//任务函数接口
void key_task(void *pdata);
//////////////////////////////////////////////////////////////////////////////
OS_EVENT * msg_key; //按键邮箱事件块指针
OS_EVENT * sem_w; //电机正转信号量指针
OS_EVENT * sem_aw; //电机反转信号量指针
OS_EVENT * sem_ac; //电机加速信号量指针
OS_EVENT * sem_de; //电机减速信号量指针
//////////////////////////////////////////////////////////////////////////////
u32 fre_motor;
u32 num_r;//电机转速 r/min
u32 comp=250;
u32 flag;
u8 temperature;
u8 humidity;
float speed_now;
int main(void)
{
u32 i;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init();
BEEP_Init(); //蜂鸣器初始化
KEY_Init(); //按键初始化
/*****************************************************************************/
LCD_ShowNum(8,272+8,0,1,16);//坐标原点
LCD_DrawLine(16, 80, 16, 272);
LCD_DrawLine(16-8, 80+8, 16, 80);
LCD_DrawLine(16+8, 80+8, 16, 80);
LCD_ShowString(24,80,209,119,16,"Humi/%");
for(i=1;i<6;i++)
{
LCD_DrawLine(16, 80+32*i, 24, 80+32*i);
if(i!=1)
{
LCD_ShowNum(0,80+32*i,(100-(i-1)*20),2,16);
}
}
LCD_DrawLine(16, 272, 208, 272);
LCD_DrawLine(208-8, 272-8, 208, 272);
LCD_DrawLine(208-8, 272+8, 208, 272);
LCD_ShowString(200,280,209,119,16,"t/s");
for(i=1;i<6;i++)
{
LCD_DrawLine(16+32*i, 264, 16+32*i, 272);
LCD_ShowNum(8+32*i,272+8,32*i,3,16);
}
/******************************************************************************/
TIM3_PWM_Init(720-1,100); //1000hz=72Mhz/(720*100)
LCD_ShowString(48,0,209,119,16,"r/min");
Getfreq_configuration();
TIM_SetCompare1(TIM3,comp);
TIM_SetCompare2(TIM3,720);
OSInit(); //初始化UCOSII
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
msg_key=OSMboxCreate((void*)0); //创建消息邮箱
sem_w=OSSemCreate(0); //创建正转信号量
sem_aw=OSSemCreate(0); //创建反转信号量
sem_ac=OSSemCreate(0); //创建加速信号量
sem_de=OSSemCreate(0); //创建减速信号量
OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(motor_dht_task,(void *)0,(OS_STK*)&MOTOR_DHT_TASK_STK[MOTOR_DHT_STK_SIZE-1],MOTOR_DHT_TASK_PRIO);
OSTaskCreate(motor_w_task,(void *)0,(OS_STK*)&MOTOR_W_TASK_STK[MOTOR_W_STK_SIZE-1],MOTOR_W_TASK_PRIO);
OSTaskCreate(motor_aw_task,(void *)0,(OS_STK*)&MOTOR_AW_TASK_STK[MOTOR_AW_STK_SIZE-1],MOTOR_AW_TASK_PRIO);
OSTaskCreate(motor_ac_task,(void *)0,(OS_STK*)&MOTOR_AC_TASK_STK[MOTOR_AC_STK_SIZE-1],MOTOR_AC_TASK_PRIO);
OSTaskCreate(motor_de_task,(void *)0,(OS_STK*)&MOTOR_DE_TASK_STK[MOTOR_DE_STK_SIZE-1],MOTOR_DE_TASK_PRIO);
OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);
OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
TIM4_Int_Init(7200,10000);
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
//温湿度任务
void motor_dht_task(void *pdata)
{
LCD_ShowString(8,48,209,119,16,"temp:");
//LCD_ShowString(8,64,209,119,16,"Humi:");
while(1)
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
LCD_ShowNum(48,48,temperature,2,16); //显示温度
//LCD_ShowNum(48,64,humidity,2,16); //显示湿度
if(temperature<19)//开电机
{
TIM_SetCompare1(TIM3,720);
TIM_SetCompare2(TIM3,250);
}
if(temperature>21)//关电机
{
TIM_SetCompare1(TIM3,720);
TIM_SetCompare2(TIM3,720);
}
delay_ms(20);
}
}
//电机正转任务
void motor_w_task(void *pdata)
{
u8 err;
while(1)
{
LCD_ShowString(8,32,209,119,16,"Z");
OSSemPend(sem_w,0,&err);
flag=1;
TIM_SetCompare1(TIM3,comp);
TIM_SetCompare2(TIM3,720);
delay_ms(20);
}
}
//电机反转任务
void motor_aw_task(void *pdata)
{
u8 err;
while(1)
{
LCD_ShowString(8,32,209,119,16,"F");
OSSemPend(sem_aw,0,&err);
flag=0;
TIM_SetCompare1(TIM3,720);
TIM_SetCompare2(TIM3,comp);
delay_ms(20);
}
}
//电机加速任务
void motor_ac_task(void *pdata)
{
u8 err;
while(1)
{
LCD_ShowString(8,16,209,119,16,"LOW MODE");
OSSemPend(sem_ac,0,&err);
comp+=10;
if(comp>700)
{
comp=700;
}
if(flag==1)//正转加速
{
TIM_SetCompare1(TIM3,comp);
TIM_SetCompare2(TIM3,720);
}
if(flag==0)//反转加速
{
TIM_SetCompare1(TIM3,720);
TIM_SetCompare2(TIM3,comp);
}
delay_ms(20);
}
}
//电机减速任务
void motor_de_task(void *pdata)
{
u8 err;
while(1)
{
LCD_ShowString(8,16,209,119,16,"ADD MODE");
OSSemPend(sem_de,0,&err);
comp-=10;
if(comp<10)
{
comp=10;
}
if(flag==1)//正转减速
{
TIM_SetCompare1(TIM3,comp);
TIM_SetCompare2(TIM3,720);
}
if(flag==0)//反转减速
{
TIM_SetCompare1(TIM3,720);
TIM_SetCompare2(TIM3,comp);
}
delay_ms(20);
}
}
//主任务
void main_task(void *pdata)
{
u32 key=0;
u8 err;
while(1)
{
speed_now=Get_speed();
LCD_ShowxNum(0,0,speed_now,6,16,0);
//delay_us(10000);
key=(u32)OSMboxPend(msg_key,10,&err);
switch(key)
{
case 1://控制正转
OSSemPost(sem_w);
break;
case 2://控制反转
OSSemPost(sem_aw);
break;
case 3://控制加速
OSSemPost(sem_ac);
break;
case 4://控制减速
OSSemPost(sem_de);
break;
}
delay_ms(50);
}
}
//按键扫描任务
void key_task(void *pdata)
{
u8 key;
while(1)
{
key=KEY_Scan(0);
if(key)
{
OSMboxPost(msg_key,(void*)key);//发送消息
}
delay_ms(100);
}
}
复制代码
作者:
xin4633
时间:
2017-4-4 22:21
我是新来的,见笑了,有没有可以控制步进电机按照绝五个档位上升或者下降,而且每个档位有一个有一个绝对的下降高度数值
作者:
YOU1988
时间:
2017-4-10 20:39
学习了,一直想搞操作系统
作者:
8imi8
时间:
2017-6-19 00:45
感谢分享,。。。
作者:
phiyun
时间:
2018-3-21 17:33
好东西 下来学习
作者:
tao180539
时间:
2018-6-2 14:23
非常有用啊,谢谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1