|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png (59.06 KB, 下載次數(shù): 31)
下載附件
2023-5-4 14:23 上傳
51hei.gif (44.1 KB, 下載次數(shù): 41)
下載附件
2023-5-4 21:20 上傳
單片機(jī)源程序如下:
- #include "sys.h"
- #include "led.h"
- #include "lcd.h"
- #include "motor.h"
- #include "delay.h"
- #include "includes.h"
- ////////////////////////事件標(biāo)志組//////////////////////////////
- #define KEY_FLAG 0x01
- #define KEYFLAGS_VALUE 0X00
- OS_FLAG_GRP *EventFlags; //定義一個(gè)事件標(biāo)志組
- /////////////////////////UCOSII任務(wù)設(shè)置///////////////////////////////////
- //START 任務(wù):創(chuàng)建其他任務(wù)的入口//開始任務(wù)的優(yōu)先級(jí)設(shè)置為最低
- #define START_TASK_PRIO 10 //設(shè)置任務(wù)優(yōu)先級(jí)
- #define START_STK_SIZE 64 //設(shè)置任務(wù)堆棧大小
- OS_STK START_TASK_STK[START_STK_SIZE];//任務(wù)堆棧
- void start_task(void *pdata); //任務(wù)函數(shù)
-
-
- //LED0任務(wù):每100ms:完成紅色LED的一個(gè)周期閃爍、檢測(cè)一次按鍵且將結(jié)果發(fā)送到事件標(biāo)志組
- #define LED0_TASK_PRIO 9 //設(shè)置任務(wù)優(yōu)先級(jí)
- #define LED0_STK_SIZE 64 //設(shè)置任務(wù)堆棧大小
- OS_STK LED0_TASK_STK[LED0_STK_SIZE]; //任務(wù)堆棧
- void led0_task(void *pdata); //任務(wù)函數(shù)
- //LCD任務(wù):每500ms:在屏幕上顯示adc、電機(jī)轉(zhuǎn)速
- #define LCD_TASK_PRIO 8 //設(shè)置任務(wù)優(yōu)先級(jí)
- #define LCD_STK_SIZE 64//設(shè)置任務(wù)堆棧大小
- OS_STK LCD_TASK_STK[LCD_STK_SIZE]; //任務(wù)堆棧
- void LCD_task(void *pdata); //任務(wù)函數(shù)
- //MOTOR任務(wù):每200ms:控制電機(jī)換向、測(cè)量一次ADC
- #define MOTOR_TASK_PRIO 7 //設(shè)置任務(wù)優(yōu)先級(jí)
- #define MOTOR_STK_SIZE 64//設(shè)置任務(wù)堆棧大小
- OS_STK MOTOR_TASK_STK[MOTOR_STK_SIZE]; //任務(wù)堆棧
- void MOTOR_task(void *pdata); //任務(wù)函數(shù)
- //LCD_KEY任務(wù): 每100ms: 在屏幕上顯示(事件)開關(guān)是否按下
- #define LCD_KEY_TASK_PRIO 6 //設(shè)置任務(wù)優(yōu)先級(jí)
- #define LCD_KEY_STK_SIZE 64//設(shè)置任務(wù)堆棧大小
- OS_STK LCD_KEY_TASK_STK[LCD_KEY_STK_SIZE]; //任務(wù)堆棧
- void LCD_KEY_task(void *pdata); //任務(wù)函數(shù)
- int main(void)
- {
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級(jí)分組為組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- delay_init(); //延時(shí)函數(shù)初始化
- LED_Init(); //初始化與LED連接的硬件接口
- LCD_Init(); //初始化與LCD連接的硬件接口
- MOTOR_Init(); //初始化PWM/GPIO復(fù)用硬件接口
- MOTOR_ADC_Init(); //初始化ADC復(fù)用硬件接口
- OSInit();
- 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)
- {
- INT8U err;
-
- OS_CPU_SR cpu_sr=0;
- pdata = pdata;
- OS_ENTER_CRITICAL(); //進(jìn)入臨界區(qū)(無(wú)法被中斷打斷)
-
- //事件創(chuàng)建
- EventFlags = OSFlagCreate (KEYFLAGS_VALUE, //事件標(biāo)志組初始值
- &err); //錯(cuò)誤碼
-
- //LED紅燈的任務(wù)創(chuàng)建
- OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
- //事件標(biāo)志----LCD_KEY的任務(wù)創(chuàng)建
- OSTaskCreate(LCD_KEY_task,(void *)0,(OS_STK*)&LCD_KEY_TASK_STK[LCD_KEY_STK_SIZE-1],LCD_KEY_TASK_PRIO);
- //電機(jī)的任務(wù)創(chuàng)建
- OSTaskCreate(MOTOR_task,(void *)0,(OS_STK*)&MOTOR_TASK_STK[MOTOR_STK_SIZE-1],MOTOR_TASK_PRIO);
-
- //屏幕的任務(wù)創(chuàng)建
- OSTaskCreate(LCD_task,(void *)0,(OS_STK*)&LCD_TASK_STK[LCD_STK_SIZE-1],LCD_TASK_PRIO);
- OSTaskSuspend(START_TASK_PRIO); //掛起起始任務(wù).
- OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷)
- }
復(fù)制代碼
Keil代碼與Proteus仿真求指導(dǎo):
無(wú)刷直流電機(jī).7z
(373.34 KB, 下載次數(shù): 135)
2023-5-4 21:22 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|