我就用TIM和DMA设计的一片带两个电机口,实际可支持到100K以上(程序速度优化)主要部分程序
void DMA_Configuration(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)TIM1_PSC_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&MotorIncCurve[MotorA][1] ;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 5;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
DMA_ClearITPendingBit(DMA1_IT_TC5);
//DMA_Cmd(DMA1_Channel5, ENABLE);
}
//******************************************************************************
//TIM1_Init For MotorA
//******************************************************************************
void TIM1_Init_For_MotorA()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 3;
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter =0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 2;//Polarity_High
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
//TIM_Cmd(TIM1, ENABLE);
}
//******************************************************************************
//MOTORA_RUN
//******************************************************************************
void MotorA_Run(unsigned char MotorA_Dir,unsigned MotorA_Pulse)
{
MotorA_BUMPFlag=0;
GPIO_WriteBit(MotorA_EnPin,Bit_SET);
GPIO_WriteBit(MotorA_SONPin,Bit_RESET);
GPIO_WriteBit(MotorA_RSTPin,Bit_SET);
if(MotorA_Dir) GPIO_WriteBit(MotorA_DirPin,Bit_SET);
else GPIO_WriteBit(MotorA_DirPin,Bit_RESET);
if(MotorA_Pulse)
{
if(MotorA_Pulse==1)
{
IncSpeedStepNumberA=MotorA_Pulse+1;
ConSpeedStepNumberA=0;
NecSpeedStepNumberA=0;
MotorA_CurveChangeStep=NecSpeed;
}
else if(MotorA_Pulse<=(CurveStepNumber[MotorA]*2))
{
IncSpeedStepNumberA=MotorA_Pulse/2+MotorA_Pulse%2;
ConSpeedStepNumberA=0;
NecSpeedStepNumberA=MotorA_Pulse/2;
MotorA_CurveChangeStep=IncSpeed;
}
else if((MotorA_Pulse>(CurveStepNumber[MotorA]*2)))
{
IncSpeedStepNumberA=CurveStepNumber[MotorA];
ConSpeedStepNumberA=MotorA_Pulse-(CurveStepNumber[MotorA]*2);
NecSpeedStepNumberA=CurveStepNumber[MotorA];
MotorA_CurveChangeStep=IncSpeed;
}
if(ConSpeedStepNumberA)MotorA_ConSpeedFlag=1;
else MotorA_ConSpeedFlag=0;
DMA1_Channel5->CCR &= 0xFFFFFFFE;//Disable DMA1_Channel5
DMA1_Channel5->CNDTR=IncSpeedStepNumberA;//DMA_BufferSize
DMA1_Channel5->CMAR=(u32)&MotorIncCurve[MotorA][1];//DMA_MemoryBaseAddr
DMA1_Channel5->CCR |=0x0080;//DMA_MemoryInc_Enable
DMA1_Channel5->CCR |=0x0001;//DMA启动
TIM1->PSC =MotorIncCurve[MotorA][0];
TIM1->EGR =TIM_PSCReloadMode_Immediate;
//TIM1->RCR =0;
//TIM1->ARR =5;
TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);
//TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM1->CR1 |=0x0001;//定时器启动
MotorA_RunFlag=1;
}
}
/*******************************************************************************
* Function Name : DMA1_Channel5_IRQHandler
* Description : This function handles DMA1 Channel 5 interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void DMA1_Channel5_IRQHandler(void)
{
DMA1->IFCR = DMA1_IT_TC5;//清DMA中断标志
if(MotorA_CurveChangeStep==NecSpeed)
{
TIM1->CR1 &= 0xfffe;//定时器停止
MotorA_RunFlag=0;
}
if(MotorA_ConSpeedFlag)MotorA_CurveChangeStep++;
else MotorA_CurveChangeStep +=2;
if(MotorA_CurveChangeStep==ConSpeed)
{
DMA1_Channel5->CCR &= 0xFFFFFFFE;//Disable DMA1_Channel5
DMA1_Channel5->CNDTR=ConSpeedStepNumberA;//DMA_BufferSize
DMA1_Channel5->CMAR=(u32)&MotorIncCurve[MotorA][IncSpeedStepNumberA];//DMA_MemoryBaseAddr
DMA1_Channel5->CCR &=0xff7f;//DMA_MemoryInc_Disable
DMA1_Channel5->CCR |=0x0001;//DMA启动
//TIM1->PSC=MotorIncCurve[ConSpeedStepNumber];
//TIM1->CR1 |= 0x0001;//定时器启动
}
if(MotorA_CurveChangeStep==NecSpeed)
{
DMA1_Channel5->CCR &=0xFFFFFFFE;//Disable DMA1_Channel5
DMA1_Channel5->CNDTR=NecSpeedStepNumberA+1;//DMA_BufferSize
DMA1_Channel5->CMAR=(u32)&MotorNecCurve[MotorA][Inc_NecCurveUseRamSpace[MotorA]-NecSpeedStepNumberA];//DMA_MemoryBaseAddr
DMA1_Channel5->CCR |=0x0080;//DMA_MemoryInc_Enable
DMA1_Channel5->CCR |=0x0001;//DMA启动
//TIM1->PSC=MotorNecCurve[Inc_NecCurveUseRamSpace-NecSpeedStepNumber-1];
//TIM1->CR1 |= 0x0001;//定时器启动
}
}
#pragma location=".Curve8"
//100K
const unsigned short MotorCurve8[1024] =
{
0xf6ea,0xe02c,0xc56b,0xad01,0x98bd,0x885d,0x1226,0x0ffc,0x0e77,0x0d51,0x0c6a,
0x0bac,0x0b0e,0x0a86,0x0a11,0x09aa,0x094e,0x08fc,0x08b2,0x086f,0x0832,0x07f9,
0x07c5,0x0795,0x0768,0x073e,0x0717,0x06f2,0x06d0,0x06af,0x0690,0x0673,0x0657,
0x063d,0x0624,0x060c,0x05f5,0x05df,0x05ca,0x05b6,0x05a2,0x0590,0x057e,0x056d,
0x055c,0x054c,0x053c,0x052d,0x051f,0x0511,0x0503,0x04f6,0x04ea,0x04dd,0x04d1,
0x04c6,0x04ba,0x04af,0x04a4,0x049a,0x0490,0x0486,0x047c,0x0473,0x046a,0x0461,
0x0458,0x044f,0x0447,0x043f,0x0437,0x042f,0x0427,0x0420,0x0418,0x0411,0x040a,
0x0403,0x03fd,0x03f6,0x03ef,0x03e9,0x03e3,0x03dd,0x03d7,0x03d1,0x03cb,0x03c5,
0x03bf,0x03ba,0x03b5,0x03af,0x03aa,0x03a5,0x03a0,0x039b,0x0396,0x0391,0x038c,
0x0388,0x0383,0x037e,0x037a,0x0376,0x0371,0x036d,0x0369,0x0365,0x0360,0x035c,
0x0358,0x0354,0x0351,0x034d,0x0349,0x0345,0x0342,0x033e,0x033a,0x0337,0x0333,
0x0330,0x032d,0x0329,0x0326,0x0323,0x031f,0x031c,0x0319,0x0316,0x0313,0x0310,
0x030d,0x030a,0x0307,0x0304,0x0301,0x02fe,0x02fb,0x02f9,0x02f6,0x02f3,0x02f0,
0x02ee,0x02eb,0x02e8,0x02e6,0x02e3,0x02e1,0x02de,0x02dc,0x02d9,0x02d7,0x02d5,
0x02d2,0x02d0,0x02cd,0x02cb,0x02c9,0x02c7,0x02c4,0x02c2,0x02c0,0x02be,0x02bc,
0x02b9,0x02b7,0x02b5,0x02b3,0x02b1,0x02af,0x02ad,0x02ab,0x02a9,0x02a7,0x02a5,
0x02a3,0x02a1,0x029f,0x029d,0x029b,0x029a,0x0298,0x0296,0x0294,0x0292,0x0290,
0x028f,0x028d,0x028b,0x0289,0x0288,0x0286,0x0284,0x0283,0x0281,0x027f,0x027e,
0x027c,0x027a,0x0279,0x0277,0x0276,0x0274,0x0273,0x0271,0x0270,0x026e,0x026c,
0x026b,0x0269,0x0268,0x0267,0x0265,0x0264,0x0262,0x0261,0x025f,0x025e,0x025d,
0x025b,0x025a,0x0258,0x0257,0x0256,0x0254,0x0253,0x0252,0x0250,0x024f,0x024e,
0x024d,0x024b,0x024a,0x0249,0x0247,0x0246,0x0245,0x0244,0x0243,0x0241,0x0240,
0x023f,0x023e,0x023d,0x023b,0x023a,0x0239,0x0238,0x0237,0x0236,0x0234,0x0233,
0x0232,0x0231,0x0230,0x022f,0x022e,0x022d,0x022c,0x022b,0x0229,0x0228,0x0227,
0x0226,0x0225,0x0224,0x0223,0x0222,0x0221,0x0220,0x021f,0x021e,0x021d,0x021c,
0x021b,0x021a,0x0219,0x0218,0x0217,0x0216,0x0215,0x0214,0x0213,0x0212,0x0211,
0x0211,0x0210,0x020f,0x020e,0x020d,0x020c,0x020b,0x020a,0x0209,0x0208,0x0207,
0x0207,0x0206,0x0205,0x0204,0x0203,0x0202,0x0201,0x0201,0x0200,0x01ff,0x01fe,
0x01fd,0x01fc,0x01fc,0x01fb,0x01fa,0x01f9,0x01f8,0x01f7,0x01f7,0x01f6,0x01f5,
0x01f4,0x01f4,0x01f3,0x01f2,0x01f1,0x01f0,0x01f0,0x01ef,0x01ee,0x01ed,0x01ed,
0x01ec,0x01eb,0x01ea,0x01ea,0x01e9,0x01e8,0x01e7,0x01e7,0x01e6,0x01e5,0x01e5,
0x01e4,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,
0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,0x01e3,
0x01e3,0x01e3,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,0x01e2,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,0x01e1,
0x01e1,0x01e1,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,0x01e0,
0x01e0
}; |