OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4143|回复: 4

UCOSIII+MPU6050调节PWM

[复制链接]

26

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
669
金钱
669
注册时间
2015-9-15
在线时间
143 小时
发表于 2015-12-6 20:46:35 | 显示全部楼层 |阅读模式
5金钱
刚学了不久UCOS,现在在做一个简单的实验,就是用6050测试倾斜角,根据倾斜方向然后调节pwm_num是加还是减,系统能够运行,pwm-num通过串口和显示屏都鞥看到有明显的加减,但是led的变化不是太明显。下面是代码
[mw_shl_code=c,true]#include "sys.h" #include "delay.h" #include "usart.h" #include "lcd.h" #include "led.h" #include "pwm.h" #include "mpu6050.h" #include "inv_mpu.h" #include "inv_mpu_dmp_motion_driver.h" #include "includes.h" /************************************************ ALIENTEK MiniSTM32开发板UCOS实验 例6-1 UCOSIII 任务创建于删除 技术支持:www.openedv.com 淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。 广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK ************************************************/ //UCOSIII中以下优先级用户程序不能使用,ALIENTEK //将这些优先级分配给了UCOSIII的5个系统内部任务 //优先级0:中断服务服务管理任务 OS_IntQTask() //优先级1:时钟节拍任务 OS_TickTask() //优先级2:定时任务 OS_TmrTask() //优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask() //优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask() //技术支持:www.openedv.com //淘宝店铺:http://eboard.taobao.com //广州市星翼电子科技有限公司 //作者:正点原子 @ALIENTEK u8 pwm_num=0; float pitch,roll,yaw; //欧拉角 short aacx,aacy,aacz; //加速度传感器原始数据 short gyrox,gyroy,gyroz; //陀螺仪原始数据 //任务优先级 #define START_TASK_PRIO 3 //任务堆栈大小 #define START_STK_SIZE 128 //任务控制块 OS_TCB StartTaskTCB; //任务堆栈 CPU_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *p_arg); //任务优先级 #define MPU6050_TASK_PRIO 4 //任务堆栈大小 #define MPU6050_STK_SIZE 128 //任务控制块 OS_TCB MPU6050_TaskTCB; //任务堆栈 CPU_STK MPU6050_TASK_STK[MPU6050_STK_SIZE]; void mpu6050_task(void *p_arg); //任务优先级 #define PWM_TASK_PRIO 5 //任务堆栈大小 #define PWM_STK_SIZE 128 //任务控制块 OS_TCB PWM_TaskTCB; //任务堆栈 CPU_STK PWM_TASK_STK[PWM_STK_SIZE]; //任务函数 void pwm(void *p_arg); //LCD刷屏时使用的颜色 int lcd_discolor[14]={ WHITE, BLACK, BLUE, BRED, GRED, GBLUE, RED, MAGENTA, GREEN, CYAN, YELLOW,BROWN, BRRED, GRAY }; //主函数 int main(void) { OS_ERR err; CPU_SR_ALLOC(); delay_init(); //时钟初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置 uart_init(115200); //串口初始化 LED_Init(); //LED初始化 LCD_Init(); //LCD初始化 TIM1_PWM_Init(899,0); MPU_Init(); while(mpu_dmp_init()) { LCD_ShowString(30,130,200,16,16,"MPU6050 Error"); delay_ms(200); LCD_Fill(30,130,239,130+16,WHITE); delay_ms(200); } POINT_COLOR = RED; LCD_ShowString(30,10,200,16,16,"ALIENTEK STM32F1"); LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 6-1"); LCD_ShowString(30,50,200,16,16,"Task Creat and Del"); LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,90,200,16,16,"2015/3/19"); OSInit(&err); //初始化UCOSIII OS_CRITICAL_ENTER(); //进入临界区 //创建开始任务 OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制块 (CPU_CHAR * )"start task", //任务名字 (OS_TASK_PTR )start_task, //任务函数 (void * )0, //传递给任务函数的参数 (OS_PRIO )START_TASK_PRIO, //任务优先级 (CPU_STK * )&START_TASK_STK[0], //任务堆栈基地址 (CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位 (CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小 (OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度, (void * )0, //用户补充的存储区 (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项 (OS_ERR * )&err); //存放该函数错误时的返回值 OS_CRITICAL_EXIT(); //退出临界区 OSStart(&err); //开启UCOSIII } //开始任务任务函数 void start_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init(); #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //统计任务 #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间 CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //进入临界区 //创建TASK1任务 OSTaskCreate((OS_TCB * )&MPU6050_TaskTCB, (CPU_CHAR * )"mpu6050 task", (OS_TASK_PTR )mpu6050_task, (void * )0, (OS_PRIO )MPU6050_TASK_PRIO, (CPU_STK * )&MPU6050_TASK_STK[0], (CPU_STK_SIZE)MPU6050_STK_SIZE/10, (CPU_STK_SIZE)MPU6050_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建TASK2任务 OSTaskCreate((OS_TCB * )&WM_TaskTCB, (CPU_CHAR * )"PWM task1", (OS_TASK_PTR )pwm, (void * )0, (OS_PRIO )PWM_TASK_PRIO, (CPU_STK * )&WM_TASK_STK[0], (CPU_STK_SIZE)PWM_STK_SIZE/10, (CPU_STK_SIZE)PWM_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_CRITICAL_EXIT(); //退出临界区 OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身 } //task1任务函数 void mpu6050_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; POINT_COLOR = BLACK; OS_CRITICAL_ENTER(); LCD_DrawRectangle(5,110,115,314); //画一个矩形 LCD_DrawLine(5,130,115,130); //画线 POINT_COLOR = BLUE; LCD_ShowString(6,111,110,16,16,"Task1 Run:000"); OS_CRITICAL_EXIT(); while(1) { if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0) { printf("任务1已经执行:%d次\r\n",pwm_num); MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据 pitch=pitch*100; if(pitch>200&&roll<0) pwm_num++; if(pitch<90&&roll>0) pwm_num--; OSTimeDlyHMSM(0,0,0,50,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s } } } //task2任务函数 void pwm(void *p_arg) { OS_ERR err; p_arg = p_arg; LED0=0; while(1) { LCD_ShowxNum(86,111,pwm_num,3,16,0x80); //显示任务执行次数 TIM_SetCompare1(TIM1,pwm_num); OSTimeDlyHMSM(0,0,0,50,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s } } [/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-6 23:12:31 | 显示全部楼层
回复

使用道具 举报

26

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
669
金钱
669
注册时间
2015-9-15
在线时间
143 小时
 楼主| 发表于 2015-12-7 10:26:58 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------原子哥,是哪里的问题啊
回复

使用道具 举报

26

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
669
金钱
669
注册时间
2015-9-15
在线时间
143 小时
 楼主| 发表于 2015-12-7 21:52:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我把pwm口换成TIM3的通道1,然后可以了。现在的问题是哦,我初始化了LED0=0;可是运行结果LED0依然亮,不知道是不是UCOSIII里边用到了PA8也就是LED0做指示,我在里边没有找到这个指令
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-10 00:13:58 | 显示全部楼层
回复【4楼】835110287:
---------------------------------
仿真看看寄存器状态就知道了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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