|
采用UCOSII操作系統(tǒng)的STM32直流電機(jī)控制還帶濕度測量曲線的功能.
0.png (59.9 KB, 下載次數(shù): 114)
下載附件
2017-3-20 19:52 上傳
完整源碼下載:
簡易STM32直流電機(jī)控制+濕度測量曲線.7z
(289.12 KB, 下載次數(shù): 92)
2022-12-16 04:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -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任務(wù)堆棧設(shè)置///////////////////////////////////
- //START 任務(wù)
- //設(shè)置任務(wù)優(yōu)先級
- #define START_TASK_PRIO 10 //開始任務(wù)的優(yōu)先級設(shè)置為最低
- //設(shè)置任務(wù)堆棧大小
- #define START_STK_SIZE 64
- //創(chuàng)建任務(wù)堆棧空間
- OS_STK START_TASK_STK[START_STK_SIZE];
- //任務(wù)函數(shù)接口
- void start_task(void *pdata);
-
- //溫濕度任務(wù)
- //設(shè)置任務(wù)優(yōu)先級
- #define MOTOR_DHT_TASK_PRIO 9
- //設(shè)置任務(wù)堆棧大小
- #define MOTOR_DHT_STK_SIZE 64
- //創(chuàng)建任務(wù)堆棧空間
- OS_STK MOTOR_DHT_TASK_STK[MOTOR_DHT_STK_SIZE];
- //任務(wù)函數(shù)接口
- void motor_dht_task(void *pdata);
-
- //電機(jī)正轉(zhuǎn)任務(wù)
- //設(shè)置任務(wù)優(yōu)先級
- #define MOTOR_W_TASK_PRIO 8
- //設(shè)置任務(wù)堆棧大小
- #define MOTOR_W_STK_SIZE 64
- //創(chuàng)建任務(wù)堆棧空間
- OS_STK MOTOR_W_TASK_STK[MOTOR_W_STK_SIZE];
- //任務(wù)函數(shù)接口
- void motor_w_task(void *pdata);
- //電機(jī)反轉(zhuǎn)任務(wù)
- //設(shè)置任務(wù)優(yōu)先級
- #define MOTOR_AW_TASK_PRIO 7
- //設(shè)置任務(wù)堆棧大小
- #define MOTOR_AW_STK_SIZE 64
- //創(chuàng)建任務(wù)堆棧空間
- OS_STK MOTOR_AW_TASK_STK[MOTOR_AW_STK_SIZE];
- //任務(wù)函數(shù)接口
- void motor_aw_task(void *pdata);
- //電機(jī)加速任務(wù)
- //設(shè)置任務(wù)優(yōu)先級
- #define MOTOR_AC_TASK_PRIO 6
- //設(shè)置任務(wù)堆棧大小
- #define MOTOR_AC_STK_SIZE 64
- //創(chuàng)建任務(wù)堆棧空間
- OS_STK MOTOR_AC_TASK_STK[MOTOR_AC_STK_SIZE];
- //任務(wù)函數(shù)接口
- void motor_ac_task(void *pdata);
- //電機(jī)減速任務(wù)
- //設(shè)置任務(wù)優(yōu)先級
- #define MOTOR_DE_TASK_PRIO 5
- //設(shè)置任務(wù)堆棧大小
- #define MOTOR_DE_STK_SIZE 64
- //創(chuàng)建任務(wù)堆棧空間
- OS_STK MOTOR_DE_TASK_STK[MOTOR_DE_STK_SIZE];
- //任務(wù)函數(shù)接口
- void motor_de_task(void *pdata);
- //主任務(wù)
- //設(shè)置任務(wù)優(yōu)先級
- #define MAIN_TASK_PRIO 4
- //設(shè)置任務(wù)堆棧大小
- #define MAIN_STK_SIZE 128
- //創(chuàng)建任務(wù)堆棧空間
- OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
- //任務(wù)函數(shù)接口
- void main_task(void *pdata);
- //按鍵掃描任務(wù)
- //設(shè)置任務(wù)優(yōu)先級
- #define KEY_TASK_PRIO 3
- //設(shè)置任務(wù)堆棧大小
- #define KEY_STK_SIZE 64
- //創(chuàng)建任務(wù)堆棧空間
- OS_STK KEY_TASK_STK[KEY_STK_SIZE];
- //任務(wù)函數(shù)接口
- void key_task(void *pdata);
- //////////////////////////////////////////////////////////////////////////////
- OS_EVENT * msg_key; //按鍵郵箱事件塊指針
- OS_EVENT * sem_w; //電機(jī)正轉(zhuǎn)信號量指針
- OS_EVENT * sem_aw; //電機(jī)反轉(zhuǎn)信號量指針
- OS_EVENT * sem_ac; //電機(jī)加速信號量指針
- OS_EVENT * sem_de; //電機(jī)減速信號量指針
- //////////////////////////////////////////////////////////////////////////////
- u32 fre_motor;
- u32 num_r;//電機(jī)轉(zhuǎn)速 r/min
- u32 comp=250;
- u32 flag;
- u8 temperature;
- u8 humidity;
- float speed_now;
- int main(void)
- {
- u32 i;
- delay_init(); //延時函數(shù)初始化
- NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
- uart_init(9600);
- LED_Init(); //初始化與LED連接的硬件接口
- LCD_Init();
- BEEP_Init(); //蜂鳴器初始化
- KEY_Init(); //按鍵初始化
-
- /*****************************************************************************/
- LCD_ShowNum(8,272+8,0,1,16);//坐標(biāo)原點(diǎn)
-
- 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 );//創(chuàng)建起始任務(wù)
- OSStart();
- }
- //開始任務(wù)
- void start_task(void *pdata)
- {
- OS_CPU_SR cpu_sr=0;
- pdata = pdata;
- msg_key=OSMboxCreate((void*)0); //創(chuàng)建消息郵箱
- sem_w=OSSemCreate(0); //創(chuàng)建正轉(zhuǎn)信號量
- sem_aw=OSSemCreate(0); //創(chuàng)建反轉(zhuǎn)信號量
- sem_ac=OSSemCreate(0); //創(chuàng)建加速信號量
- sem_de=OSSemCreate(0); //創(chuàng)建減速信號量
- OSStatInit(); //初始化統(tǒng)計(jì)任務(wù).這里會延時1秒鐘左右
- OS_ENTER_CRITICAL(); //進(jìn)入臨界區(qū)(無法被中斷打斷)
- 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); //掛起起始任務(wù).
-
- TIM4_Int_Init(7200,10000);
-
- OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷)
- }
- //溫濕度任務(wù)
- 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)//開電機(jī)
- {
- TIM_SetCompare1(TIM3,720);
- TIM_SetCompare2(TIM3,250);
- }
- if(temperature>21)//關(guān)電機(jī)
- {
- TIM_SetCompare1(TIM3,720);
- TIM_SetCompare2(TIM3,720);
- }
- delay_ms(20);
- }
- }
- //電機(jī)正轉(zhuǎn)任務(wù)
- 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);
- }
- }
- //電機(jī)反轉(zhuǎn)任務(wù)
- 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);
- }
- }
- //電機(jī)加速任務(wù)
- 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)//正轉(zhuǎn)加速
- {
- TIM_SetCompare1(TIM3,comp);
- TIM_SetCompare2(TIM3,720);
- }
- if(flag==0)//反轉(zhuǎn)加速
- {
- TIM_SetCompare1(TIM3,720);
- TIM_SetCompare2(TIM3,comp);
- }
- delay_ms(20);
- }
- }
- //電機(jī)減速任務(wù)
- 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)//正轉(zhuǎn)減速
- {
- TIM_SetCompare1(TIM3,comp);
- TIM_SetCompare2(TIM3,720);
- }
- if(flag==0)//反轉(zhuǎn)減速
- {
- TIM_SetCompare1(TIM3,720);
- TIM_SetCompare2(TIM3,comp);
- }
- delay_ms(20);
- }
- }
- //主任務(wù)
- 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://控制正轉(zhuǎn)
- OSSemPost(sem_w);
- break;
- case 2://控制反轉(zhuǎn)
- OSSemPost(sem_aw);
- break;
- case 3://控制加速
- OSSemPost(sem_ac);
- break;
- case 4://控制減速
- OSSemPost(sem_de);
- break;
- }
- delay_ms(50);
- }
- }
- //按鍵掃描任務(wù)
- void key_task(void *pdata)
- {
- u8 key;
- while(1)
- {
- key=KEY_Scan(0);
- if(key)
- {
- OSMboxPost(msg_key,(void*)key);//發(fā)送消息
- }
- delay_ms(100);
- }
- }
復(fù)制代碼
|
|