找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2451|回复: 5
打印 上一主题 下一主题
收起左侧

STM32单片机无刷直流电机驱动程序与Proteus仿真图

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include "sys.h"         
  2. #include "led.h"
  3. #include "lcd.h"
  4. #include "motor.h"
  5. #include "delay.h"        
  6. #include "includes.h"

  7. ////////////////////////事件标志组//////////////////////////////
  8. #define KEY_FLAG                0x01
  9. #define KEYFLAGS_VALUE        0X00                                                
  10. OS_FLAG_GRP        *EventFlags;                //定义一个事件标志组

  11. /////////////////////////UCOSII任务设置///////////////////////////////////

  12. //START 任务:创建其他任务的入口//开始任务的优先级设置为最低

  13. #define START_TASK_PRIO                              10 //设置任务优先级
  14. #define START_STK_SIZE                                  64 //设置任务堆栈大小
  15. OS_STK START_TASK_STK[START_STK_SIZE];//任务堆栈
  16. void start_task(void *pdata);        //任务函数
  17.                         
  18.                         
  19. //LED0任务:每100ms:完成红色LED的一个周期闪烁、检测一次按键且将结果发送到事件标志组

  20. #define LED0_TASK_PRIO                               9 //设置任务优先级
  21. #define LED0_STK_SIZE                                      64 //设置任务堆栈大小
  22. OS_STK LED0_TASK_STK[LED0_STK_SIZE];        //任务堆栈        
  23. void led0_task(void *pdata);        //任务函数

  24. //LCD任务:每500ms:在屏幕上显示adc、电机转速

  25. #define LCD_TASK_PRIO                               8 //设置任务优先级
  26. #define LCD_STK_SIZE                                      64//设置任务堆栈大小
  27. OS_STK LCD_TASK_STK[LCD_STK_SIZE];        //任务堆栈        
  28. void LCD_task(void *pdata);        //任务函数

  29. //MOTOR任务:每200ms:控制电机换向、测量一次ADC

  30. #define MOTOR_TASK_PRIO                               7 //设置任务优先级
  31. #define MOTOR_STK_SIZE                                      64//设置任务堆栈大小
  32. OS_STK MOTOR_TASK_STK[MOTOR_STK_SIZE];        //任务堆栈        
  33. void MOTOR_task(void *pdata);        //任务函数

  34. //LCD_KEY任务: 每100ms: 在屏幕上显示(事件)开关是否按下

  35. #define LCD_KEY_TASK_PRIO                               6 //设置任务优先级
  36. #define LCD_KEY_STK_SIZE                                      64//设置任务堆栈大小
  37. OS_STK LCD_KEY_TASK_STK[LCD_KEY_STK_SIZE];        //任务堆栈        
  38. void LCD_KEY_task(void *pdata);        //任务函数


  39. int main(void)
  40. {        
  41.          
  42.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  43.         delay_init();            //延时函数初始化         
  44.         LED_Init();                          //初始化与LED连接的硬件接口
  45.         LCD_Init();                                //初始化与LCD连接的硬件接口
  46.         MOTOR_Init();                //初始化PWM/GPIO复用硬件接口
  47.         MOTOR_ADC_Init();        //初始化ADC复用硬件接口
  48.         OSInit();   
  49.          OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
  50.         OSStart();                  
  51. }
  52.          
  53. //开始任务
  54. void start_task(void *pdata)
  55. {
  56.         INT8U err;
  57.         
  58.   OS_CPU_SR cpu_sr=0;
  59.         pdata = pdata;
  60.   OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)
  61.         
  62.         //事件创建
  63.         EventFlags = OSFlagCreate (KEYFLAGS_VALUE, //事件标志组初始值
  64.                                                                 &err);                                        //错误码
  65.         
  66.         //LED红灯的任务创建
  67.          OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);               

  68.         //事件标志----LCD_KEY的任务创建
  69.          OSTaskCreate(LCD_KEY_task,(void *)0,(OS_STK*)&LCD_KEY_TASK_STK[LCD_KEY_STK_SIZE-1],LCD_KEY_TASK_PRIO);        

  70.         //电机的任务创建
  71.         OSTaskCreate(MOTOR_task,(void *)0,(OS_STK*)&MOTOR_TASK_STK[MOTOR_STK_SIZE-1],MOTOR_TASK_PRIO);                        
  72.                
  73.         //屏幕的任务创建
  74.         OSTaskCreate(LCD_task,(void *)0,(OS_STK*)&LCD_TASK_STK[LCD_STK_SIZE-1],LCD_TASK_PRIO);        

  75.         OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
  76.         OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
  77. }
复制代码

Keil代码与Proteus仿真求指导: 无刷直流电机.7z (373.34 KB, 下载次数: 135)

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1075527 发表于 2023-5-8 16:21 | 只看该作者
请问有C语言编程程序吗楼主?
回复

使用道具 举报

板凳
ID:228452 发表于 2023-5-9 00:35 | 只看该作者
LCD_MOTOR_CODE   dir included in package  Keil software..
回复

使用道具 举报

地板
ID:1079577 发表于 2023-5-24 21:54 | 只看该作者
这啥玩意 不好使啊
回复

使用道具 举报

5#
ID:374009 发表于 2024-3-9 06:42 | 只看该作者
代码写的挺规范,但是运行不起来。跑的系统
回复

使用道具 举报

6#
ID:316613 发表于 2024-5-10 16:29 | 只看该作者
电机不转动
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表