[mw_shl_code=c,true]写的程序,做实验时,电机2和电机三及tim2的ch2和ch3通电时转,过几秒钟就不转了,求大神讲解[/mw_shl_code]
[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "usart.h"
#include "includes.h"
//ALIENTEK Mini STM32??·?°?·????ú??35
//UCOSII???é1-?????÷??
//?????§????www.openedv.com
//?????????í??×?????????????
/////////////////////////UCOSII?????è??///////////////////////////////////
u16 s=0;
INT8U err;
//START ????
//?è????????????
#define START_TASK_PRIO 10 //?????????????????è????×???
//?è???????????ó??
#define START_STK_SIZE 64
//????????
OS_STK START_TASK_STK[START_STK_SIZE];
//????????
void start_task(void *pdata);
//PWM????
//?è????????????
#define PWM_TASK_PRIO 4
//?è???????????ó??
#define PWM_STK_SIZE 64
//????????
OS_STK PWM_TASK_STK[PWM_STK_SIZE];
//????????
void PWM_task(void *pdata);
//LED1????
//?è????????????
#define LED1_TASK_PRIO 7
//?è???????????ó??
#define LED1_STK_SIZE 64
//????????
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//????????
void led1_task(void *pdata);
//?®??
#define USART_TASK_PRIO 6 //?????????????????è????×???
//?è???????????ó??
#define USART_STK_SIZE 64
//????????
OS_STK USART_TASK_STK[USART_STK_SIZE];
//????????
void USART_task(void *pdata);
OS_EVENT *LED0_Box;
//???ú
#define duoji_TASK_PRIO 5 //?????????????????è????×???
//?è???????????ó??
#define duoji_STK_SIZE 64
//????????
OS_STK duoji_TASK_STK[USART_STK_SIZE];
//????????
void duoji_task(void *pdata);
u8 t,i;
u8 len;
u8 dir=1;
u16 times=0,pp[14],x,y,duoji,xx,yy;
u16 led0pwmval=0;
/*u16 a0[8]={0,1,0,1,1,0,1,0};
u16 a1[8]={0,0,0,0,1,0,0,0};
u16 a2[8]={1,0,0,1,0,1,1,0};
u16 a3[8]={0,1,0,1,1,0,1,0};
u16 a4[8]={0,0,0,0,0,0,0,0};
u16 a5[8]={1,0,1,0,0,1,0,1};
u16 a6[8]={0,1,1,0,1,0,0,1};
u16 a7[8]={0,1,1,0,1,0,0,1};
u16 a8[8]={1,0,1,0,0,1,0,1};
u16 a9[8]={1,0,1,0,1,0,1,0};
u16 aa[8]={0,1,0,1,0,1,0,1};*/
u16 a0[8]={1,0,1,0,0,1,0,1};
u16 a1[8]={0,1,1,0,1,0,0,1};
u16 a2[8]={0,1,1,0,1,0,0,1};
u16 a3[8]={1,0,1,0,0,1,0,1};
u16 a4[8]={0,0,0,0,0,0,0,0};
u16 a5[8]={0,1,0,1,1,0,1,0};
u16 a6[8]={1,0,0,1,0,1,1,0};
u16 a7[8]={1,0,0,1,0,1,1,0};
u16 a8[8]={0,1,0,1,1,0,1,0};
u16 a9[8]={0,1,0,1,0,1,0,1};
u16 aa[8]={1,0,1,0,1,0,1,0};
void zhuanhuan(u16 *ch)
{
M1A=ch[0];
M1B=ch[1];
M2A=ch[2];
M2B=ch[3];
M3A=ch[4];
M3B=ch[5];
M4A=ch[6];
M4B=ch[7];
}
int main(void)
{
delay_init(); //???±??????????
uart_init(9600);
TIM1_PWM_Init(7999,0);
NVIC_Configuration();
LED_Init(); //????????LED??????????????
OSInit();
LED0_Box=OSMboxCreate((void *)0);
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=0;
pdata = pdata;
OS_ENTER_CRITICAL(); //??????????(??·¨±??????ò??) °?×°?????? UCOSII???±??
OSTaskCreate(PWM_task,(void *)0,(OS_STK*)&

WM_TASK_STK[PWM_STK_SIZE-1],PWM_TASK_PRIO);
OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskCreate(USART_task,(void *)0,(OS_STK*)&USART_TASK_STK[USART_STK_SIZE-1],USART_TASK_PRIO);
OSTaskCreate(PWM_task,(void *)0,(OS_STK*)&

WM_TASK_STK[PWM_STK_SIZE-1],PWM_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //????????????.
OS_EXIT_CRITICAL(); //??????????(????±??????ò??)
}
//LED0????
void PWM_task(void *pdata)
{
while(1)
{
//a=OSMboxPend(LED0_Box,10,&err);
//LED0=*a;
//delay_ms(300);
for(i=0;i<14;i++)
{
if(USART_RX_BUF
=='0') pp=0;
if(USART_RX_BUF=='1') pp=1;
if(USART_RX_BUF=='2') pp=2;
if(USART_RX_BUF=='3') pp=3;
if(USART_RX_BUF=='4') pp=4;
if(USART_RX_BUF=='5') pp=5;
if(USART_RX_BUF=='6') pp=6;
if(USART_RX_BUF=='7') pp=7;
if(USART_RX_BUF=='8') pp=8;
if(USART_RX_BUF=='9') pp=9;
}
//if(USART_RX_BUF[1]=='0')
y=(1000*pp[5]+100*pp[4]+10*pp[3]+pp[2]);
x=(1000*pp[9]+100*pp[8]+10*pp[7]+pp[6]);
xx=0.707*(x-y);
yy=0.727*(x+y);
//if(USART_RX_BUF[1]=='1')
//else duoji=0;
if(x>7999) xx=7999;
if(y>7999) yy=7999;
if(pp[1]==1)
{
switch(pp[0])
{
case 0: zhuanhuan(a0);break;
case 1: zhuanhuan(a1);break;
case 2: zhuanhuan(a2);break;
case 3: zhuanhuan(a3);break;
case 4: zhuanhuan(a4);break;
case 5: zhuanhuan(a5);break;
case 6: zhuanhuan(a6);break;
case 7: zhuanhuan(a7);break;
case 8: zhuanhuan(a8);break;
}
/*if(pp[0]==3||pp[0]==5)
xx=yy;
if(pp[0]==1||pp[0]==7)
xx=yy;*/
TIM2->CCR1=yy;
TIM2->CCR2=xx;
TIM2->CCR3=yy;
TIM2->CCR4=xx;
}
else{
if(pp[1]==0)//???±??×?
zhuanhuan(a9);
if(pp[1]==2)//???±??×?
zhuanhuan(aa);
TIM2->CCR1=3000;
TIM2->CCR2=3000;
TIM2->CCR3=3000;
TIM2->CCR4=3000;
}
delay_ms(100);
}
}
//LED1????
void led1_task(void *pdata)//????????????×???
{
while(1)
{
LED1=0;
delay_ms(300);
LED1=1;
delay_ms(300);
};
}
//USART????
void USART_task(void *pdata)
{
u8 t;
u8 len;
u16 times=0;
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//?????????????????????¤??
printf("\r\n?ú·???????????:\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//????·????á??
}
printf("\r\n\r\n");//????????
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\r\nALIENTEK MiniSTM32??·?°? ?®?????é\r\n");
printf("??????×?@ALIENTEK\r\n\r\n\r\n");
}
if(times%200==0)printf("??????????,???????ü?á??\r\n");
if(times%30==0)//????LED0,?á??????????????.
{
LED0=!LED0;
}
delay_ms(10);
}
}
}
//???ú????
void duoji_task(void *pdata)//????????????×???
{
while(1)
{
for(i=2;i<10;i++)
{
if(USART_RX_BUF=='0') pp[i-2]=0;
if(USART_RX_BUF=='1') pp[i-2]=1;
if(USART_RX_BUF=='2') pp[i-2]=2;
if(USART_RX_BUF=='3') pp[i-2]=3;
if(USART_RX_BUF=='4') pp[i-2]=4;
if(USART_RX_BUF=='5') pp[i-2]=5;
if(USART_RX_BUF=='6') pp[i-2]=6;
if(USART_RX_BUF=='7') pp[i-2]=7;
if(USART_RX_BUF=='8') pp[i-2]=8;
if(USART_RX_BUF=='9') pp[i-2]=9;
}
duoji=(1000*pp[4]+100*pp[5]+10*pp[6]+pp[7])/4095*2000;
GPIO_SetBits(GPIOB,GPIO_Pin_2);
delay_us(duoji);
};
}
[/mw_shl_code]