1.基本介紹
A4950的峰值輸出電流可達±3.5 A,工作電壓為7.6~40v。
優(yōu)點:相對于L298N模塊控制2個電機正反轉(zhuǎn)僅需要4個I/O口,體積小,發(fā)熱低。
缺點:需要2個PWM引腳才能控制正反轉(zhuǎn),所以控制2個電機需要4PWM引腳,會使用STM32F103芯片一個定時器的全部PWM通道。
A4950模塊是靠輸入2路的PWM占空比的差值,來設(shè)定輸出電壓的大小,當(dāng)差值為0時輸出為0,反之當(dāng)占空比差值為100時輸出最大。
2.引腳功能和接線
引腳名稱 | 輸入\輸出 | 接線 | 功能 |
AOUT1 | ? ? 輸出 | ????????接A電機正 | 輸出電壓控制電機 |
AOUT2 | ????輸出 | ????????接A電機負 | 輸出電壓控制電機 |
BOUT1 | ? ? 輸出 | ????????接B電機正 | 輸出電壓控制電機 |
BOUT2 | ? ? 輸出 | ????????接B電機負 | 輸出電壓控制電機 |
AIN1 | ? ? 輸入?? | ? ? ? ? 接STM32 A7 | 控制電機輸出電壓 |
AIN2 | ? ? 輸入?? | ????????接STM32 B1 | 控制電機輸出電壓 |
BIN1 | ? ? 輸入?? | ????????接STM32 A6 | 控制電機輸出電壓 |
BIN2 | ? ? 輸入?? | ????????接STM32 B0 | 控制電機輸出電壓 |
VM | ? ? 輸入?? | ? ? ? ? 接12V電源 | 總電源 |
VCC |
? ? 輸入?? | ????????接5V電源 | 給內(nèi)部邏輯電路供電 |
GND | ? ? 輸出? | ????????接電源地 | 接地 |
3程序設(shè)計
接下來我使用STM32F103C8T6的標(biāo)準(zhǔn)庫代碼為例
定時器3初始化代碼
#include "stm32f10x.h" // Device header
void PWM_Init3(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure1;
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure1);
GPIO_InitTypeDef GPIO_InitStructure2;
GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure2);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100-1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 3600-1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //輸出比較模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;//CCR
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_Cmd(TIM3,ENABLE);
}
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1 (TIM3,Compare);
}
void PWM_SetCompare2(uint16_t Compare)
{
TIM_SetCompare2 (TIM3,Compare);
}
void PWM_SetCompare3(uint16_t Compare)
{
TIM_SetCompare3 (TIM3,Compare);
}
void PWM_SetCompare4(uint16_t Compare)
{
TIM_SetCompare4 (TIM3,Compare);
}
電機控制函數(shù)
#include "stm32f10x.h" // Device header
#include "PWM.h"
void Motor_Init(void)
{
PWM_Init3();
}
// you
void Motor_SetSpeed2(int16_t Speed)
{
PWM_SetCompare3(50-Speed/2);
PWM_SetCompare1(50+Speed/2);
}
//zuo
void Motor_SetSpeed1(int16_t Speed)
{
PWM_SetCompare2(50-Speed/2);
PWM_SetCompare4(50+Speed/2);
}
?mian函數(shù)代碼文章來源:http://www.zghlxwxcb.cn/news/detail-440629.html
#include "stm32f10x.h" // Device header
#include "Motor.h"
int main (void)
{
Motor_Init(); //電機驅(qū)動初始化
while(1)
{
Motor_SetSpeed1(20);//給電機1 向前20速度
Motor_SetSpeed2(20);//給電機2 向前20速度
}
}
全部源碼鏈接:主控/C8T6/A4950 · 亟待/electronic-game-code - 碼云 - 開源中國 (gitee.com)https://gitee.com/AD123zsg/electronic-game-code/tree/master/%E4%B8%BB%E6%8E%A7/C8T6/A4950文章來源地址http://www.zghlxwxcb.cn/news/detail-440629.html
到了這里,關(guān)于基于STM32F103的PWM電機驅(qū)動A4950的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!