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