一,項目目標
實現(xiàn)利用STM32F103C8T6+TB6612,輸出不同占空比輸出的PWM波,從而實現(xiàn)電機不同轉(zhuǎn)速的運行、正反轉(zhuǎn)的功能;
?
?二、硬件涉及
1,STM32核心板
2,TB6612直流電機驅(qū)動模塊
3,直流電機?
三、硬件接線涉及
1,先看TB6612直流電機驅(qū)動模塊:
①驅(qū)動模塊是具備兩路PWM輸入,兩路out口,兩路AIN,可以實現(xiàn)對兩個不同電機的轉(zhuǎn)速控制、方向控制;
②模塊引腳
僅使用第一路電機
PWMA控制電機占空比、AIN1 AIN2控制輸入、A01 A02電機驅(qū)動
核心點:PWM控制電機轉(zhuǎn)速、AIN控制轉(zhuǎn)向、AO用于輸出
?
2,STM32核心板接線
四、前置知識介紹
1,定時器輸出比較,輸出PWM波
見微項目02介紹
?五、代碼模塊介紹
1,思路分析:
①開始RCC時鐘,GPIO和TIM2時鐘模塊
②開啟TIM2時鐘輸入源為內(nèi)部72MHZ
③配置時鐘模塊,ARR和PSC模塊
④輸出比較模塊配置
⑤配置TIM2輸出端口的GPIO,復用推挽輸出
⑥開始使能時鐘
⑦動態(tài)配置CCR
⑧配置PA4,PA5控制輸出、配置GPIO模塊
下面開始代碼介紹:
①配置GPIO時鐘和TIM2的模塊時鐘
//配置時鐘RCC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
②配置TIM2的時鐘源,內(nèi)部時鐘72MHZ
//配置時鐘源為RCC -72mhz
TIM_InternalClockConfig(TIM2);
③配置時基模塊,主要是ARR和PSC
//配置時基單元數(shù)值
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period=100-1; //ARR
TIM_TimeBaseInitStruct.TIM_Prescaler=720-1; //psc
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
④輸出比較單元配置
//輸出比較單元配置
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1 ;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High ;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse=0;//設置CCR數(shù)值
TIM_OC3Init(TIM2, &TIM_OCInitStruct);
⑤配置PWM輸出的端口PA2的GPIO? ---復用推挽輸出
// 配置PA2端口
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct);
⑥開啟時鐘
//啟動定時器
TIM_Cmd(TIM2,ENABLE);
⑦動態(tài)配置CCR函數(shù)
void pwm_setcompare( uint16_t compare)
{
TIM_SetCompare3(TIM2, compare);
}
⑧配置PA4,PA5控制輸出、配置GPIO模塊---推挽輸出?
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct);
到此核心代碼已經(jīng)配置完成
具體在代碼各個模塊的體現(xiàn)
PWM模塊
#include "stm32f10x.h" // Device header
void pwm_init(void)
{
//配置時鐘RCC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//配置時鐘源為RCC -72mhz
TIM_InternalClockConfig(TIM2);
//配置時基單元數(shù)值
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period=100-1; //ARR
TIM_TimeBaseInitStruct.TIM_Prescaler=720-1; //psc
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
//輸出比較單元配置
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1 ;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High ;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse=0;//設置CCR數(shù)值
TIM_OC3Init(TIM2, &TIM_OCInitStruct);
// 配置PA2端口
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct);
//啟動定時器
TIM_Cmd(TIM2,ENABLE);
}
void pwm_setcompare( uint16_t compare)
{
TIM_SetCompare3(TIM2, compare);
}
motor模塊配置,對于pwm模塊二次封裝和調(diào)整文章來源:http://www.zghlxwxcb.cn/news/detail-765627.html
#include "stm32f10x.h" // Device header
#include "pwm.h"
void motor_init(void)
{
pwm_init();
//初始化方向控制的PA4 PA5
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct);
}
void motor_setspeed(int8_t speed)
{
if(speed >=0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
pwm_setcompare(speed);
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
pwm_setcompare(-speed);
}
}
在主函數(shù)的中簡單配置文章來源地址http://www.zghlxwxcb.cn/news/detail-765627.html
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "OLED.H"
#include "motor.H"
#include "key.H"
uint8_t keyn=0;
int8_t speed=0;
int main()
{
OLED_Init();
motor_init();
keyinit();
OLED_ShowString(1,1,"SPEED");
OLED_ShowSignedNum(2,1,speed,3);
while(1)
{
keyn=key_getnum();
if(keyn==1)
{
speed+=20;
if(speed>100)
{
speed=-100;
}
OLED_ShowSignedNum(2,1,speed,3);
}
motor_setspeed(speed);
}
}
到了這里,關(guān)于STM32-微項目03-pwm控制直流電機運行的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!