OpenEdv-开源电子网

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

uCOSII系统中如何分配资源通过udp控制步进电机,任务中每个任务ULINK仿真都能执行,但是电机一直不转,裸机运行电机控制程序...

[复制链接]

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-11-20
在线时间
20 小时
发表于 2016-12-12 15:03:38 | 显示全部楼层 |阅读模式
10金钱
OS_EVENT *GO_MBOX;     

OS_EVENT *COME_MBOX;   


#define START_TASK_PRIO                 18  
#define START_STK_SIZE                 128
OS_STK START_TASK_STK[START_STK_SIZE];  
void start_task(void *pdata);   //èÎÎñoˉêy


#define LED_TASK_PRIO                13         
#define LED_STK_SIZE                64        
OS_STK        LED_TASK_STK[LED_STK_SIZE];
void led_task(void *pdata);      

#define        NINE_TASK_PRIO       11   
#define NINE_TASK_STK_SIZE   256   
OS_STK  NINE_TASK_STK[NINE_TASK_STK_SIZE];  
void nine_task(void *pdata);      



#define UDP_SENT_PRIO                10

#define UDP_SENT_STK_SIZE        500

OS_STK  UDP_SENT_TASK_STK[UDP_SENT_STK_SIZE];
void udp_send_task(void *arg);
        

#define UDP_RECV_PRIO                9     
#define UDP_RECV_STK_SIZE        400
OS_STK  UDP_RECV_TASK_STK[UDP_RECV_STK_SIZE];  
void udp_recv_task(void *arg);


#define        MOTOR_CONTR_TASK_PRIO       8   
#define MOTOR_CONTR_TASK_STK_SIZE   128   
OS_STK  MOTOR_CONTR_TASK_STK[MOTOR_CONTR_TASK_STK_SIZE];  
void motor_contr_task(void *pdata);  

/**************************************************************

                    main
                                                                                 
**************************************************************/
int main(void)
{         
        delay_init();                       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);                        
        usmart_dev.init(72);                        
        my_mem_init(SRAMIN);               

        printf("ENC28J60+STM32\r\n");        
        printf("UDP NETCONN Test\r\n");        
        printf("ATOM@ALIENTEK\r\n");
        printf("2016/11/30\r\n");  
         
        OSInit();                                
        while(lwip_comm_init())         
        {
        
                printf("Lwip Init failed!\r\n");
                delay_ms(500);
        }
        printf("Lwip Init Success!\r\n");                 

        OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);
        OSStart();
}


void start_task(void *pdata)
{
        OS_CPU_SR cpu_sr;
        pdata = pdata ;
        
        OSStatInit();                          
        OS_ENTER_CRITICAL();  
        OSTaskCreate(nine_task,
                                   (void*)0,
                                  (OS_STK*)&NINE_TASK_STK[NINE_TASK_STK_SIZE - 1],
                                NINE_TASK_PRIO);
        OSTaskCreate(led_task,
                                (void*)0,
                                (OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],
                                LED_TASK_PRIO);         
        OSTaskCreate(motor_contr_task,
                                (void*)0,
                                (OS_STK*)&MOTOR_CONTR_TASK_STK[MOTOR_CONTR_TASK_STK_SIZE-1],
                                MOTOR_CONTR_TASK_PRIO);         
  OSTaskCreate(udp_send_task,
                        (void*)0,
                        (OS_STK*)&UDP_SENT_TASK_STK[UDP_SENT_STK_SIZE-1],
                         UDP_SENT_PRIO);
  OSTaskCreate(udp_recv_task,
                                (void*)0,
                                 (OS_STK*)&UDP_RECV_TASK_STK[UDP_RECV_STK_SIZE-1],
                                 UDP_RECV_PRIO);
                                                         
        OSTaskSuspend(OS_PRIO_SELF);
        OS_EXIT_CRITICAL();
                                                         
}




//电机控制任务

void motor_contr_task(void *pdata)
{
          INT8U OS_err;
                char *msg;
        
                uint8_t Mo_flag = 0;        
          Motor_contr_Init();
    TIM3_PWM_Init(35999,1);
          OSTimeDlyHMSM(0,0,0,100);
                for(;;)
                 {                 
                         msg = (char *)OSMboxPend(COME_MBOX,50,&OS_err);
                         if(OS_err == OS_ERR_NONE)
                         {               
                                         if (*msg == 'M' && *(msg+1) == 'C')
                                         {
                                                  Mo_flag = 1;
                                                        if (Mo_flag && *(msg+2) == 'l' && *(msg+3) == 'f')        
                                                        {                                
                                                                        puls_left(35999,5000,0);
                                                        }
                                                        else if (Mo_flag &&(*msg+4) == 'l' && *(msg+5) == 'g')
                                                        {
                                                                        puls_ligt(35999,5000,1);
                                                        }
                                                        Mo_flag = 0;
                                         }
                                         
                         }
                        else
                        {
                                OSTimeDlyHMSM(0,0,0,10);
                        }
                        OSTimeDlyHMSM(0,0,0,50);
                }                                
}        


//电机转动固定方向固定脉冲
void Motor_contr_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
        

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3   
                                    |GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;                                                                                                                           
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;     
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
}




void puls_left(u16 f,u16 count,u8 direction)
{
  unsigned char flag=1;
  u16 number,temp=count;

  GPIO_ResetBits(GPIOE,GPIO_Pin_2);
        GPIO_ResetBits(GPIOE,GPIO_Pin_1);  
  TIM3_PWM_Init(f,1);      
  TIM_SetCompare3(TIM3,f/2);  
        
        if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_1) == direction)
        {
             LED1=0;
        }
        else
        {
                   LED1=1;
        }
  do{

                number=TIM3->CNT ;        
                if(flag&&number>=f/2)      
                {
                        
                temp=temp-1;
                flag=0;
                 
                }
                if(number>=1&&number<f/2)
                {
                 
                flag=1;
                 
                }
  }
        while(temp>0);
  GPIO_SetBits(GPIOE,GPIO_Pin_2);
        LED1=1;
  if(!temp)
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);  

}


void puls_ligt(u16 f,u16 count,u8 direction)
{
  unsigned char flag=1;
  u16 number,temp=count;
        
  GPIO_ResetBits(GPIOE,GPIO_Pin_2);
        GPIO_SetBits(GPIOE,GPIO_Pin_1);
  TIM3_PWM_Init(f,1);
  TIM_SetCompare3(TIM3,f/2);
        if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_1) == direction)
        {
             LED0=0;
        }
        else
        {
                   LED0=1;
        }
  do{

                number=TIM3->CNT ;      
                if(flag&&number>=f/2)      
                {
                        
                temp=temp-1;
                flag=0;
                 
                }
                if(number>=1&&number<f/2)
                {
                 
                flag=1;
                 
                }
  }
        while(temp>0);  
        
  GPIO_SetBits(GPIOE,GPIO_Pin_2);
        LED0=1;
  if(!temp)
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);  
}



最佳答案

查看完整内容[请看2#楼]

自己仿真跟踪,分析下逻辑吧。。。你这提问问题都没写完。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2016-12-12 15:03:39 | 显示全部楼层
自己仿真跟踪,分析下逻辑吧。。。你这提问问题都没写完。。。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-11-20
在线时间
20 小时
 楼主| 发表于 2016-12-13 11:50:19 | 显示全部楼层
正点原子 发表于 2016-12-12 18:22
自己仿真跟踪,分析下逻辑吧。。。你这提问问题都没写完。。。

谢谢原子哥。问题已经解决,是我两个任务中邮箱等待时间的问题,又用mallco开辟了接发的数据内存的问题,第一次发帖,没找到能上传文本格式的方法,以后都来请教和分享
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-2 00:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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