采用UCOSII操作系统的STM32直流电机控制还带湿度测量曲线的功能.
完整源码下载:
简易STM32直流电机控制+湿度测量曲线.7z
(289.12 KB, 下载次数: 92)
主程序:
- #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);
- }
- }
复制代码
|