久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于STM32簡易電機伺服控制器源碼
[打印本頁]
作者:
南山Ⅰ
時間:
2017-8-23 10:57
標題:
基于STM32簡易電機伺服控制器源碼
簡單電機伺服控制器實例全在壓縮包里,超級實用
STM32單片機源程序如下:
#include "BSP.h"
/*****************************************
Author :JasonLin
Version :V2.0 Ownership-Reserved
Description:MCIO Board support package
*****************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組2 兩位搶占(0-3) 兩位響應(0-3)=
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
///////////////////////////////////////CAN 0 1
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//*****************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//******************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//*******************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//*******************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//*******************************************************
NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*優先級分組:優先級分組是為了給搶占式優先級和響應優先級在中斷優先級寄存器的高四位分配各自所占的位數
在同一個程序中優先級分組只能設定一次 */
/*搶占優先級: 當一個中斷正在執行而另一個具有更高搶占優先級的中斷到來時,搶占優先級高的就會搶占CPU處理權
此時兩個中斷就屬于嵌套中斷關系,具有相同搶占優先級的中斷沒有嵌套關系*/
/*響應優先級:即副優先級,當兩個搶占優先級相同的中斷同時到來,具有響應優先級高的中斷優先獲得CPU的處理權
如果中斷不是同時到來,則后來的要等待正在執行的中斷處理完才能獲得響應*/
}
///////////////////定時器功能初始化
void TIM1_Configuration(void)//TIM1四通道分別輸出PWM1/PWM2/PWM3/PWM4,對應引腳為PA8/PA9/PA10/PA11
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用滿負載輸出為3.3V
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = PWMPeriod;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM1->CCR1 = 3600;
TIM1->CCR2 = 3600;
TIM1->CCR3 = 3600;
TIM1->CCR4 = 3600;
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
////////////////////////////
void TIM8_Configuration(void)//TIM8四通道分別輸出PWM1/PWM2/PWM3/PWM4,對應引腳為PC6/PC7/PC8/PC9
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = PWMPeriod;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC2Init(TIM8, &TIM_OCInitStructure);
TIM_OC3Init(TIM8, &TIM_OCInitStructure);
TIM_OC4Init(TIM8, &TIM_OCInitStructure);
TIM8->CCR1 = 3600;
TIM8->CCR2 = 3600;
TIM8->CCR3 = 3600;
TIM8->CCR4 = 3600;
TIM_Cmd(TIM8, ENABLE);
TIM_CtrlPWMOutputs(TIM8, ENABLE);
}
/////////////////////////////
void TIM2_Configuration(void)//編碼器接口設置(TIM2)/PA15-A相 PB3-B相
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //關閉JTAG接口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //關閉JTAG接口 開啟SWD
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE); //TIM2引腳重定向
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(GPIOA, GPIO_Pin_15,Bit_SET);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PB3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_3,Bit_SET);
TIM_TimeBaseStructure.TIM_Period = ECDPeriod; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //設置用來作為TIMx時鐘頻率除數的預分頻值 不分頻
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//設置定時器2為編碼器模式 IT1 IT2為上升沿計數
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6; //輸入濾波器
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除所有標志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //允許中斷更新
TIM2->CNT = 0;
TIM_Cmd(TIM2, ENABLE);
}
///////////////////////////
void TIM3_Configuration(void)//編碼器接口設置(TIM3)/PA6-A相 PA7-B相
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIOA外設時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置為上拉輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口的速率為50M
GPIO_Init(GPIOA, &GPIO_InitStructure); //IO口配置函數
GPIO_WriteBit(GPIOA, GPIO_Pin_6,Bit_SET);
GPIO_WriteBit(GPIOA, GPIO_Pin_7,Bit_SET);
TIM_TimeBaseStructure.TIM_Period = ECDPeriod; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //設置用來作為TIMx時鐘頻率除數的預分頻值 不分頻
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//設置定時器3為編碼器模式 IT1 IT2為上升沿計數
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6; //輸入濾波器
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除所有標志位
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //允許中斷更新
TIM3->CNT = 0;
TIM_Cmd(TIM3, ENABLE);
}
///////////////////////////
void TIM4_Configuration(void)//編碼器接口設置(TIM4)/PB6-A相 PB7-B相
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能GPIOB外設時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置為上拉輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口的速率為50M
GPIO_Init(GPIOB, &GPIO_InitStructure); //IO口配置函數
GPIO_WriteBit(GPIOB, GPIO_Pin_6,Bit_SET);
GPIO_WriteBit(GPIOB, GPIO_Pin_7,Bit_SET);
TIM_TimeBaseStructure.TIM_Period = ECDPeriod;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//設置定時器3為編碼器模式 IT1 IT2為上升沿計數
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6; //輸入濾波器
TIM_ICInit(TIM4, &TIM_ICInitStructure);
TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除所有標志位
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //允許中斷更新
TIM4->CNT = 0;
TIM_Cmd(TIM4, ENABLE);
}
///////////////////////////
void TIM5_Configuration(void)//編碼器接口設置(TIM5)/PA0-A相 PA1-B相
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET);
GPIO_WriteBit(GPIOA, GPIO_Pin_1,Bit_SET);
TIM_TimeBaseStructure.TIM_Period = ECDPeriod;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
//設置定時器3為編碼器模式 IT1 IT2為上升沿計數
TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6;
TIM_ICInit(TIM5, &TIM_ICInitStructure);
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
TIM5->CNT = 0;
TIM_Cmd(TIM5, ENABLE);
}
/////////////////////
void TIM6_Configuration(void)//周期循環事件定時初始化
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructure.TIM_Period = TIMPeriod-1;
TIM_TimeBaseStructure.TIM_Prescaler =72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Regular);
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM6,ENABLE);
}
////////////////////
void TIM7_Configuration(void)//周期循環事件定時初始化
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
TIM_TimeBaseStructure.TIM_Period = TIMPeriod-1;
TIM_TimeBaseStructure.TIM_Prescaler =72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);
TIM_UpdateRequestConfig(TIM7,TIM_UpdateSource_Regular);
TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM7,ENABLE);
}
//////////////////////////
void TIM_Configuration(void)//TIM初始化
{
TIM1_Configuration();
TIM8_Configuration();
TIM2_Configuration();
TIM3_Configuration();
TIM4_Configuration();
TIM5_Configuration();
TIM6_Configuration();
TIM7_Configuration();
}
///////////////////////電機速度寫入接口
void MotorSpeedSetOne(s32 MotorSpeed)//電機1轉速/轉向設置(TIM1)
{
s32 PwmOne_Set,PwmOne_Mode;
if(MotorSpeed > PWMPeriod-PWMLOSS) MotorSpeed = PWMPeriod-PWMLOSS ;//上限 CCR的值必須小于或等于ARR的值
if(MotorSpeed <-(PWMPeriod-PWMLOSS)) MotorSpeed = -(PWMPeriod-PWMLOSS);//下限
if(MotorSpeed<0) { PwmOne_Set = -MotorSpeed; PwmOne_Mode = MotorOneBack;}
else { PwmOne_Set = MotorSpeed; PwmOne_Mode = MotorOneForward;}
if(PwmOne_Mode) {TIM1->CCR1 = MotorSpdZero; TIM1->CCR2 = PwmOne_Set;} //MotorOneForward
else { TIM1->CCR1 = PwmOne_Set; TIM1->CCR2 = MotorSpdZero;} //MotorOneBack
}
////////////////////////////////
void MotorSpeedSetTwo(s32 MotorSpeed)//電機2轉速/轉向設置(TIM1)
{
s32 PwmTwo_Set,PwmTwo_Mode;
if(MotorSpeed > PWMPeriod-PWMLOSS) MotorSpeed = PWMPeriod-PWMLOSS ;//上限 CCR的值必須小于或等于ARR的值
if(MotorSpeed <-(PWMPeriod-PWMLOSS)) MotorSpeed = -(PWMPeriod-PWMLOSS);//下限
if(MotorSpeed<0) { PwmTwo_Set = -MotorSpeed; PwmTwo_Mode = MotorTwoBack;}
else { PwmTwo_Set = MotorSpeed; PwmTwo_Mode = MotorTwoForward;}
if(PwmTwo_Mode) {TIM1->CCR3 = MotorSpdZero; TIM1->CCR4 = PwmTwo_Set;} //MotorTwoForward
else { TIM1->CCR3 = PwmTwo_Set; TIM1->CCR4 = MotorSpdZero;} //MotorTwoBack
}
////////////////////////////////
void MotorSpeedSetThr(s32 MotorSpeed)//電機3轉速/轉向設置(TIM8)
{
s32 PwmOne_Set,PwmOne_Mode;
if(MotorSpeed > PWMPeriod-PWMLOSS) MotorSpeed = PWMPeriod-PWMLOSS ;//上限 CCR的值必須小于或等于ARR的值
if(MotorSpeed <-(PWMPeriod-PWMLOSS)) MotorSpeed = -(PWMPeriod-PWMLOSS);//下限
if(MotorSpeed<0) { PwmOne_Set = -MotorSpeed; PwmOne_Mode = MotorOneBack;}
else { PwmOne_Set = MotorSpeed; PwmOne_Mode = MotorOneForward;}
if(PwmOne_Mode) {TIM8->CCR1 = MotorSpdZero; TIM8->CCR2 = PwmOne_Set;} //MotorOneForward
else { TIM8->CCR1 = PwmOne_Set; TIM8->CCR2 = MotorSpdZero;} //MotorOneBack
}
////////////////////////////////
void MotorSpeedSetFou(s32 MotorSpeed)//電機4轉速/轉向設置(TIM8)
{
s32 PwmTwo_Set,PwmTwo_Mode;
if(MotorSpeed > PWMPeriod-PWMLOSS) MotorSpeed = PWMPeriod-PWMLOSS ;//上限 CCR的值必須小于或等于ARR的值
if(MotorSpeed <-(PWMPeriod-PWMLOSS)) MotorSpeed = -(PWMPeriod-PWMLOSS);//下限
if(MotorSpeed<0) { PwmTwo_Set = -MotorSpeed; PwmTwo_Mode = MotorTwoBack;}
else { PwmTwo_Set = MotorSpeed; PwmTwo_Mode = MotorTwoForward;}
if(PwmTwo_Mode) {TIM8->CCR3 = MotorSpdZero; TIM8->CCR4 = PwmTwo_Set;} //MotorTwoForward
else { TIM8->CCR3 = PwmTwo_Set; TIM8->CCR4 = MotorSpdZero;} //MotorTwoBack
}
///////////LED 初始化
void Led_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
}
//////SYSTICK 初始化
void Systick_Configuration(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時鐘 HCLK/8 9M
}
//////延時寫入接口
void SysDelay_ms(u16 nms)//72M條件下,nms<=1864(2^24/9000)
{
u32 temp;
SysTick->LOAD=(u32)nms*Sys_ms;//時間加載(SysTick->LOAD為24bit)
SysTick->VAL =0x00; //清空計數器
SysTick->CTRL=0x01; //開始倒數
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時間到達
SysTick->CTRL=0x00; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
void SysDelay_us(u32 nus)//72M條件下,nus<=2^24
{
u32 temp;
SysTick->LOAD=nus*Sys_us; //時間加載
SysTick->VAL=0x00; //清空計數器
SysTick->CTRL=0x01; //開始倒數
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時間到達
SysTick->CTRL=0x00; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
///////Board Communication Package
unsigned char sbus_rx_buffer[18];
RC_Ctl_t RC_Ctl;
void USART3_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* config USART1 clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* USART3 mode config */
USART_InitStructure.USART_BaudRate = 100000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_Even ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx ;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
}
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //開啟DMA時鐘
/*設置DMA源:內存地址&串口數據寄存器地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&(USART3->DR);
/*內存地址(要傳輸的變量的指針)*/
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)sbus_rx_buffer;
/*方向:從外設到內存*/
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ;
/*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/
DMA_InitStructure.DMA_BufferSize = 18;
/*外設地址不增*/
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
/*內存地址自增*/
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
/*外設數據單位*/
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
/*內存數據單位 8bit*/
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
/*DMA模式:循環*/
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;
/*優先級:非常高*/
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
/*禁止內存到內存的傳輸 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/*配置DMA1的3通道*/
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DMA_Cmd (DMA1_Channel3,ENABLE); //使能DMA
DMA_ITConfig(DMA1_Channel3,DMA_IT_TC,ENABLE); //配置DMA發送完成后產生中斷
}
//////Board Support Package
void BSP_Configuration(void)
{
NVIC_Configuration();
TIM_Configuration();
Led_Configuration();
Systick_Configuration();
USART3_Config();
DMA_Config();
USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
}
///////////編碼器讀取
EncoderType GetEncoder;
void Get_Encoder_ONE(void)
{
s32 CNT2_temp,CNT2_last;
GetEncoder.cnt2 = TIM2 -> CNT;
CNT2_last = GetEncoder.CNT2;
CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;
GetEncoder.V2 = CNT2_temp - CNT2_last;
while ((s32)(GetEncoder.V2)>Vbreak)
{
GetEncoder.rcnt2--;
CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;
GetEncoder.V2 = CNT2_temp - CNT2_last;
}
while ((s32)(GetEncoder.V2)<-Vbreak)
{
GetEncoder.rcnt2++;
CNT2_temp = GetEncoder.rcnt2 * prd + GetEncoder.cnt2;
GetEncoder.V2 = CNT2_temp - CNT2_last;
}
GetEncoder.CNT2 = CNT2_temp;
}
///////////////////
void Get_Encoder_TWO(void)
{
s32 CNT3_temp,CNT3_last;
GetEncoder.cnt3 = TIM3 -> CNT;
CNT3_last = GetEncoder.CNT3;
CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
GetEncoder.V3 = CNT3_temp - CNT3_last;
while ((s32)(GetEncoder.V3)>Vbreak)
{
GetEncoder.rcnt3--;
CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
GetEncoder.V3 = CNT3_temp - CNT3_last;
}
while ((s32)(GetEncoder.V3)<-Vbreak)
{
GetEncoder.rcnt3++;
CNT3_temp = GetEncoder.rcnt3 * prd + GetEncoder.cnt3;
GetEncoder.V3 = CNT3_temp - CNT3_last;
}
GetEncoder.CNT3 = CNT3_temp;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于STM32簡易電機伺服控制器.rar
(298.89 KB, 下載次數: 283)
2017-8-23 21:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
cyw610
時間:
2018-1-27 16:55
這個控制源碼有實際應用過嗎?
作者:
cyw610
時間:
2018-1-27 16:56
代碼實用過嗎?
作者:
Jason9090
時間:
2018-3-5 13:43
不錯很好,棒
作者:
reigoo
時間:
2018-4-1 21:26
牛x,好用嗎
作者:
reigoo
時間:
2018-4-1 21:26
不錯不錯
作者:
reigoo
時間:
2018-4-1 21:54
正需要
作者:
luluwen99
時間:
2018-5-9 17:08
有人用過嗎???
作者:
一沙鷗H
時間:
2018-5-24 15:50
代碼用過嗎
作者:
835660130
時間:
2018-5-29 22:10
有電氣原理圖嗎
作者:
plainsailing
時間:
2018-10-17 16:42
謝謝分享~~~~
作者:
王梓鑫
時間:
2019-1-3 06:56
有電機和單片機的接線原理圖嗎?
作者:
百花叢中過
時間:
2019-4-23 21:00
不錯,剛好需要
作者:
hblinjingfeng12
時間:
2019-4-27 11:45
謝謝提供
作者:
Richie_zen
時間:
2019-6-19 12:10
謝謝樓主奉獻!
作者:
將軍0423
時間:
2019-6-25 17:46
有電路連接圖嗎
作者:
xinydz
時間:
2019-9-29 18:13
下載看看
作者:
563345228
時間:
2020-3-20 20:19
怎么接線啊
作者:
飛向藍天nie
時間:
2020-5-22 09:21
沒參考價值,什么說明都沒有,
作者:
fffa121212
時間:
2020-10-14 09:10
有人測試過有效嗎
作者:
fffa121212
時間:
2020-10-14 09:10
請問針對的是哪個型號的伺服啊
作者:
mick32
時間:
2022-4-5 05:48
No schematics ?
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
av手机天堂
|
伦一理一级一a一片
|
能看的毛片
|
欧美日韩精品一区二区
|
日韩小视频
|
日韩国产在线播放
|
一区二区三区国产精品
|
亚洲成人a v
|
精品国产aⅴ麻豆
|
av免费网站
|
国产在线欧美
|
一级做a爰片久久毛片潮喷 视频一二区
|
a级片免费在线观看
|
在线播放亚洲
|
69视频网站
|
日本精品视频在线
|
成人午夜毛片
|
手机av在线免费观看
|
久久99精品久久久久久
|
亚洲欧美另类在线观看
|
首尔之春在线看
|
日本国产在线观看
|
一区中文字幕
|
国产一二
|
国产小精品
|
四虎最新地址
|
免费看毛片网站
|
日日干夜夜骑
|
免费一级毛片免费播放
|
国产伦精品一区二区三区视频网站
|
性视频在线
|
特级丰满少妇一级aaaa爱毛片
|
亚洲高清在线视频
|
h片免费观看
|
久久久网
|
国产肉体xxxx裸体784大胆
|
九色精品
|
欧美精品区
|
国产一区二区三区视频在线
|
欧美成人精品欧美一级私黄
|
亚洲精品国产精品国自产观看浪潮
|