标题: UCOSII简易STM32直流电机控制+湿度测量曲线 完整源码 [打印本页]

作者: FFTT    时间: 2017-3-20 17:17
标题: UCOSII简易STM32直流电机控制+湿度测量曲线 完整源码
采用UCOSII操作系统的STM32直流电机控制还带湿度测量曲线的功能.

完整源码下载:
简易STM32直流电机控制+湿度测量曲线.7z (289.12 KB, 下载次数: 92)



主程序:
  1. #include "led.h"
  2. #include "lcd.h"
  3. #include "timer.h"
  4. #include "beep.h"
  5. #include "delay.h"
  6. #include "key.h"
  7. #include "sys.h"
  8. #include "usart.h"         
  9. #include "includes.h"         
  10. #include "dht11.h"         

  11. /////////////////////////UCOSII任务堆栈设置///////////////////////////////////
  12. //START 任务
  13. //设置任务优先级
  14. #define START_TASK_PRIO                              10 //开始任务的优先级设置为最低
  15. //设置任务堆栈大小
  16. #define START_STK_SIZE                                  64
  17. //创建任务堆栈空间        
  18. OS_STK START_TASK_STK[START_STK_SIZE];
  19. //任务函数接口
  20. void start_task(void *pdata);        

  21. //温湿度任务
  22. //设置任务优先级
  23. #define MOTOR_DHT_TASK_PRIO                               9
  24. //设置任务堆栈大小
  25. #define MOTOR_DHT_STK_SIZE                                      64
  26. //创建任务堆栈空间        
  27. OS_STK MOTOR_DHT_TASK_STK[MOTOR_DHT_STK_SIZE];
  28. //任务函数接口
  29. void motor_dht_task(void *pdata);

  30. //电机正转任务
  31. //设置任务优先级
  32. #define MOTOR_W_TASK_PRIO                               8
  33. //设置任务堆栈大小
  34. #define MOTOR_W_STK_SIZE                                      64
  35. //创建任务堆栈空间        
  36. OS_STK MOTOR_W_TASK_STK[MOTOR_W_STK_SIZE];
  37. //任务函数接口
  38. void motor_w_task(void *pdata);


  39. //电机反转任务
  40. //设置任务优先级
  41. #define MOTOR_AW_TASK_PRIO                               7
  42. //设置任务堆栈大小
  43. #define MOTOR_AW_STK_SIZE                                          64
  44. //创建任务堆栈空间        
  45. OS_STK MOTOR_AW_TASK_STK[MOTOR_AW_STK_SIZE];
  46. //任务函数接口
  47. void motor_aw_task(void *pdata);

  48. //电机加速任务
  49. //设置任务优先级
  50. #define MOTOR_AC_TASK_PRIO                               6
  51. //设置任务堆栈大小
  52. #define MOTOR_AC_STK_SIZE                                          64
  53. //创建任务堆栈空间        
  54. OS_STK MOTOR_AC_TASK_STK[MOTOR_AC_STK_SIZE];
  55. //任务函数接口
  56. void motor_ac_task(void *pdata);

  57. //电机减速任务
  58. //设置任务优先级
  59. #define MOTOR_DE_TASK_PRIO                               5
  60. //设置任务堆栈大小
  61. #define MOTOR_DE_STK_SIZE                                          64
  62. //创建任务堆栈空间        
  63. OS_STK MOTOR_DE_TASK_STK[MOTOR_DE_STK_SIZE];
  64. //任务函数接口
  65. void motor_de_task(void *pdata);

  66. //主任务
  67. //设置任务优先级
  68. #define MAIN_TASK_PRIO                               4
  69. //设置任务堆栈大小
  70. #define MAIN_STK_SIZE                                          128
  71. //创建任务堆栈空间        
  72. OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
  73. //任务函数接口
  74. void main_task(void *pdata);

  75. //按键扫描任务
  76. //设置任务优先级
  77. #define KEY_TASK_PRIO                               3
  78. //设置任务堆栈大小
  79. #define KEY_STK_SIZE                                          64
  80. //创建任务堆栈空间        
  81. OS_STK KEY_TASK_STK[KEY_STK_SIZE];
  82. //任务函数接口
  83. void key_task(void *pdata);
  84. //////////////////////////////////////////////////////////////////////////////
  85. OS_EVENT * msg_key;                        //按键邮箱事件块指针
  86. OS_EVENT * sem_w;                                //电机正转信号量指针        
  87. OS_EVENT * sem_aw;                        //电机反转信号量指针        
  88. OS_EVENT * sem_ac;                        //电机加速信号量指针        
  89. OS_EVENT * sem_de;                        //电机减速信号量指针        

  90. //////////////////////////////////////////////////////////////////////////////
  91. u32 fre_motor;
  92. u32 num_r;//电机转速 r/min
  93. u32 comp=250;
  94. u32 flag;
  95. u8 temperature;              
  96. u8 humidity;
  97. float speed_now;

  98. int main(void)
  99. {        
  100.         u32 i;
  101.         delay_init();                     //延时函数初始化         
  102.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  103.         uart_init(9600);
  104.         LED_Init();                                  //初始化与LED连接的硬件接口
  105.         LCD_Init();
  106.          BEEP_Init();                        //蜂鸣器初始化        
  107.         KEY_Init();                                //按键初始化
  108.         
  109. /*****************************************************************************/        
  110.         LCD_ShowNum(8,272+8,0,1,16);//坐标原点
  111.         
  112.         LCD_DrawLine(16, 80, 16, 272);
  113.         LCD_DrawLine(16-8, 80+8, 16, 80);
  114.         LCD_DrawLine(16+8, 80+8, 16, 80);
  115.         LCD_ShowString(24,80,209,119,16,"Humi/%");
  116.         for(i=1;i<6;i++)
  117.         {
  118.                 LCD_DrawLine(16, 80+32*i, 24, 80+32*i);
  119.                 if(i!=1)
  120.                 {        
  121.                         LCD_ShowNum(0,80+32*i,(100-(i-1)*20),2,16);
  122.                 }
  123.         }
  124.         
  125.         LCD_DrawLine(16, 272, 208, 272);
  126.         LCD_DrawLine(208-8, 272-8, 208, 272);
  127.         LCD_DrawLine(208-8, 272+8, 208, 272);
  128.         LCD_ShowString(200,280,209,119,16,"t/s");
  129.         for(i=1;i<6;i++)
  130.         {
  131.                 LCD_DrawLine(16+32*i, 264, 16+32*i, 272);
  132.                 LCD_ShowNum(8+32*i,272+8,32*i,3,16);
  133.         }
  134. /******************************************************************************/
  135.         
  136.         
  137.         TIM3_PWM_Init(720-1,100);         //1000hz=72Mhz/(720*100)        
  138.         LCD_ShowString(48,0,209,119,16,"r/min");        
  139.         Getfreq_configuration();
  140.         TIM_SetCompare1(TIM3,comp);                 
  141.         TIM_SetCompare2(TIM3,720);
  142.          
  143.         
  144.         OSInit();                                   //初始化UCOSII                                          
  145.          OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
  146.         OSStart();            
  147. }

  148. //开始任务
  149. void start_task(void *pdata)
  150. {
  151.   OS_CPU_SR cpu_sr=0;
  152.         pdata = pdata;                  
  153.         msg_key=OSMboxCreate((void*)0);        //创建消息邮箱
  154.         sem_w=OSSemCreate(0);                                                //创建正转信号量        
  155.         sem_aw=OSSemCreate(0);                                        //创建反转信号量        
  156.         sem_ac=OSSemCreate(0);                                        //创建加速信号量
  157.         sem_de=OSSemCreate(0);                                        //创建减速信号量
  158.         OSStatInit();                                                                                //初始化统计任务.这里会延时1秒钟左右        
  159.          OS_ENTER_CRITICAL();                                                //进入临界区(无法被中断打断)   
  160.          OSTaskCreate(motor_dht_task,(void *)0,(OS_STK*)&MOTOR_DHT_TASK_STK[MOTOR_DHT_STK_SIZE-1],MOTOR_DHT_TASK_PRIO);                                                                                             
  161.          OSTaskCreate(motor_w_task,(void *)0,(OS_STK*)&MOTOR_W_TASK_STK[MOTOR_W_STK_SIZE-1],MOTOR_W_TASK_PRIO);                                                                                      
  162.          OSTaskCreate(motor_aw_task,(void *)0,(OS_STK*)&MOTOR_AW_TASK_STK[MOTOR_AW_STK_SIZE-1],MOTOR_AW_TASK_PRIO);        
  163.         OSTaskCreate(motor_ac_task,(void *)0,(OS_STK*)&MOTOR_AC_TASK_STK[MOTOR_AC_STK_SIZE-1],MOTOR_AC_TASK_PRIO);
  164.         OSTaskCreate(motor_de_task,(void *)0,(OS_STK*)&MOTOR_DE_TASK_STK[MOTOR_DE_STK_SIZE-1],MOTOR_DE_TASK_PRIO);
  165.          OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);                                            
  166.          OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);                                            
  167.          OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
  168.         
  169.         TIM4_Int_Init(7200,10000);
  170.         
  171.         OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
  172. }        

  173. //温湿度任务
  174. void motor_dht_task(void *pdata)
  175. {
  176.         LCD_ShowString(8,48,209,119,16,"temp:");
  177.         //LCD_ShowString(8,64,209,119,16,"Humi:");
  178.         while(1)
  179.         {               
  180.                 DHT11_Read_Data(&temperature,&humidity);                //读取温湿度值        
  181.                 LCD_ShowNum(48,48,temperature,2,16);                //显示温度                              
  182.                 //LCD_ShowNum(48,64,humidity,2,16);                        //显示湿度        
  183.                 if(temperature<19)//开电机
  184.                 {
  185.                         TIM_SetCompare1(TIM3,720);         
  186.                         TIM_SetCompare2(TIM3,250);
  187.                 }
  188.                 if(temperature>21)//关电机
  189.                 {
  190.                         TIM_SetCompare1(TIM3,720);
  191.                         TIM_SetCompare2(TIM3,720);        
  192.                 }
  193.                 delay_ms(20);
  194.         }                                                                        
  195. }

  196. //电机正转任务
  197. void motor_w_task(void *pdata)
  198. {
  199.         u8 err;
  200.         while(1)
  201.         {        
  202.                 LCD_ShowString(8,32,209,119,16,"Z");
  203.                 OSSemPend(sem_w,0,&err);        
  204.                 flag=1;
  205.                 TIM_SetCompare1(TIM3,comp);
  206.                 TIM_SetCompare2(TIM3,720);        
  207.                 delay_ms(20);
  208.         }                                                                        
  209. }           

  210. //电机反转任务
  211. void motor_aw_task(void *pdata)
  212. {
  213.         u8 err;
  214.         while(1)
  215.         {
  216.                 LCD_ShowString(8,32,209,119,16,"F");
  217.                 OSSemPend(sem_aw,0,&err);
  218.                
  219.                 flag=0;
  220.                 TIM_SetCompare1(TIM3,720);
  221.                 TIM_SetCompare2(TIM3,comp);        
  222.                 delay_ms(20);
  223.         }                                                                        
  224. }

  225. //电机加速任务
  226. void motor_ac_task(void *pdata)
  227. {
  228.         u8 err;
  229.         while(1)
  230.         {
  231.                 LCD_ShowString(8,16,209,119,16,"LOW MODE");
  232.                 OSSemPend(sem_ac,0,&err);        
  233.                 comp+=10;
  234.                 if(comp>700)
  235.                 {
  236.                         comp=700;
  237.                 }
  238.                 if(flag==1)//正转加速
  239.                 {
  240.                         TIM_SetCompare1(TIM3,comp);                 
  241.                         TIM_SetCompare2(TIM3,720);
  242.                 }
  243.                 if(flag==0)//反转加速
  244.                 {
  245.                         TIM_SetCompare1(TIM3,720);         
  246.                         TIM_SetCompare2(TIM3,comp);
  247.                 }
  248.                 delay_ms(20);
  249.         }                                                                        
  250. }

  251. //电机减速任务
  252. void motor_de_task(void *pdata)
  253. {
  254.         u8 err;
  255.         while(1)
  256.         {
  257.                 LCD_ShowString(8,16,209,119,16,"ADD MODE");        
  258.                 OSSemPend(sem_de,0,&err);
  259.                
  260.                 comp-=10;
  261.                 if(comp<10)
  262.                 {
  263.                         comp=10;
  264.                 }
  265.                 if(flag==1)//正转减速
  266.                 {
  267.                         TIM_SetCompare1(TIM3,comp);         
  268.                         TIM_SetCompare2(TIM3,720);
  269.                 }
  270.                 if(flag==0)//反转减速
  271.                 {
  272.                         TIM_SetCompare1(TIM3,720);         
  273.                         TIM_SetCompare2(TIM3,comp);
  274.                 }               
  275.                 delay_ms(20);
  276.         }                                                                        
  277. }

  278. //主任务
  279. void main_task(void *pdata)
  280. {                                                         
  281.         u32 key=0;        
  282.         u8 err;                                                
  283.         while(1)
  284.         {
  285.                 speed_now=Get_speed();
  286.                 LCD_ShowxNum(0,0,speed_now,6,16,0);
  287.                 //delay_us(10000);
  288.                 key=(u32)OSMboxPend(msg_key,10,&err);  
  289.                 switch(key)
  290.                 {
  291.                         case 1://控制正转
  292.                                 OSSemPost(sem_w);               
  293.                                 break;
  294.                         case 2://控制反转
  295.                                 OSSemPost(sem_aw);
  296.                                 break;
  297.                         case 3://控制加速
  298.                                 OSSemPost(sem_ac);
  299.                                 break;
  300.                         case 4://控制减速
  301.                                 OSSemPost(sem_de);
  302.                                 break;
  303.                 }
  304.                 delay_ms(50);
  305.         }
  306. }

  307. //按键扫描任务
  308. void key_task(void *pdata)
  309. {        
  310.         u8 key;                                                                     
  311.         while(1)
  312.         {
  313.                 key=KEY_Scan(0);   
  314.                 if(key)
  315.                 {
  316.                         OSMboxPost(msg_key,(void*)key);//发送消息
  317.                 }        
  318.                  delay_ms(100);
  319.         }
  320. }


复制代码


作者: 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