当前位置:网站首页>STM32F103 - two circuit PWM control motor
STM32F103 - two circuit PWM control motor
2022-07-02 02:03:00 【SummerLoverQy】
experimental condition
STM32F103 Development board
TB6612 Motor drive module
Reference code :
#include "car.h"
// Initialize the timer , Realization PWM Output
void PWM_Init(u16 arr,u16 psc){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //① Enable timer 3 The clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE); //① Can make GPIO and AFIO Multiplexing function clock
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //② Remap TIM3_CH2->PB5
// Set this pin to multiplex output function , Output TIM3 CH2 Of PWM Pulse shape GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // Multiplexing push pull output
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //① initialization GPIO
// initialization TIM3
TIM_TimeBaseStructure.TIM_Period = arr; // Set at auto reload cycle value
TIM_TimeBaseStructure.TIM_Prescaler =psc; // Set the prescaler value
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // Set the clock split :TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM Upcount mode
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //③ initialization TIMx
// initialization TIM3 Channel2 PWM Pattern
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // choice PWM Pattern 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // Compare output enable
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // High output polarity
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //④ Initialize peripherals TIM3 OC2
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // Enable preload register
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //④ Initialize peripherals TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // Enable preload register
TIM_Cmd(TIM3, ENABLE); //⑤ Can make TIM3
}
/**************************************************************************
The functionality : Forward and reverse rotation of motor
Entrance parameters :mode mode=0 Positive rotation at mode=1 Time reversal mode=2 It's to stop
return value : nothing
**************************************************************************/
void MOTO(int mode)
{
if(mode==PosMode )// Positive rotation
{
GPIO_SetBits(GPIOB, GPIO_Pin_13); // High level
GPIO_ResetBits(GPIOB, GPIO_Pin_14); // Low level }
GPIO_SetBits(GPIOA, GPIO_Pin_4); // High level
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // Low level
}
if(mode==NegMode)// reverse
{
GPIO_ResetBits(GPIOB, GPIO_Pin_13); // Low level
GPIO_SetBits(GPIOB, GPIO_Pin_14); // High level
GPIO_ResetBits(GPIOA, GPIO_Pin_4); // Low level
GPIO_SetBits(GPIOA, GPIO_Pin_5); // High level
}
if(mode==StopMode)// stop it
{
GPIO_ResetBits(GPIOB, GPIO_Pin_13); // Low level
GPIO_ResetBits(GPIOB, GPIO_Pin_14); // Low level }
GPIO_ResetBits(GPIOA, GPIO_Pin_4); // Low level
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // Low level
}
}
// Initialization required GPIO
void CAR_Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // Defining structure GPIO_InitStructure
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // Can make PB Port clock
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); // Can make PA Port clock
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13| GPIO_Pin_14; //PB4 PB3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // push-pull , Increase the current output capacity
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO Mouth speed
GPIO_Init(GPIOB, &GPIO_InitStructure); //GBIOB initialization
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4| GPIO_Pin_5; //PB4 PB5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // push-pull , Increase the current output capacity
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO Mouth speed
GPIO_Init(GPIOA, &GPIO_InitStructure); //GBIOA initialization
}
void CAR_Speed(u16 speed){
TIM_SetCompare1(TIM3,speed);
TIM_SetCompare2(TIM3,speed);
}
Main function reference code :
#include "stm32f10x.h"
#include "lcd.h"
#include "delay.h"
#include "remote.h"
#include "motor.h"
#include "key.h"
#include "led.h"
#include "usart.h"
#define MAXSPEED 7000
#define MINSPEED 1000
#define FILTERNUM 20
int main(void)
{
u8 Remote_key;// Remote control key value
u8 Key;// Key value
u8 *str=0;// The remote control displays
u16 speed=1000;
u16 PWM=0;
u16 filter=FILTERNUM;
delay_init(); // Delay function initialization
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // Set up NVIC Interrupt grouping 2:2 Bit preemption priority ,2 Bit response priority
uart_init(115200); // The serial port is initialized to 115200
LCD_Init();// initialization LCD function ; 320*240
Remote_Init(); // Infrared receiving initialization
LED_Init(); //LED Port initialization
//TIM3_PWM_Init(7199,0); // Regardless of the frequency .PWM frequency =72000000/900=80Khz
PWM_Init(7199,0);
KEY_Init();
CAR_Gpio_Init();
LCD_ShowString(30,60,300,16,16,"My RoBot");
LCD_ShowString(30,80,300,16,16,"MOTOR TEST:");
LCD_ShowString(30,100,300,16,16,"PWM: %");
MOTO(PosMode);
CAR_Speed(speed);// set speed
while(1){
Remote_key=Remote_Scan();
Key=KEY_Scan(0);
//TIM_SetCompare2(TIM3,led0pwmval);
if(Remote_key)
{ switch(Remote_key)
{
case 0:str="ERROR";break;
case 162:
str="STOP";
MOTO(StopMode);
break;
case 98:str="UP";break;
case 2:str="PLAY";break;
case 226:
str="Go!";
MOTO(PosMode);
break;
case 194:str="RIGHT";break;
case 34:str="LEFT";break;
case 224:
str="VOL-";
filter--;
if(!filter){
filter=FILTERNUM;
speed-=1000;
if(speed<1000){
speed=MINSPEED;
}
}
break;
case 168:str="DOWN";break;
case 144:
str="VOL+";
filter--;
if(!filter){
filter=FILTERNUM;
speed+=500;
if(speed>7000){
speed=MAXSPEED;
}
}
break;
case 104:str="1";break;
case 152:str="2";break;
case 176:str="3";break;
case 48:str="4";break;
case 24:str="5";break;
case 122:str="6";break;
case 16:str="7";break;
case 56:str="8";break;
case 90:str="9";break;
case 66:str="0";break;
case 82:str="DELETE";break;
}
}else delay_ms(10);
if(Key==KEY0_PRES){// Slow down
speed-=1000;
if(speed<1000){
speed=MINSPEED;
}
}else if(Key==KEY1_PRES){
// Speed up
speed+=500;
if(speed>7000){
speed=MAXSPEED;
}
}
CAR_Speed(speed);
LCD_Fill(30+12*8,80,300,80+16,WHITE); // Clear the previous display
LCD_ShowString(30+12*8,80,300,16,16,str); // Show SYMBOL
PWM=speed*100/7200;
LCD_ShowNum(30+4*8, 100, PWM, 2, 16);
}
}
Pin connection :
A01—— Motor negative
B01—— Motor positive
PC6——PWMA
PC7——PWMB
AIN1——PB14
AIN2——PB13
BIN1——PA5
BIN2——PA4
TB6612 Logic power supply 、 Enable signal - Depressurize 3V3 Provide
MCU power supply 5V5OUT Connect the step-down source 3V3
Encoder connection :
PA9—— Right wheel B
PA8—— Right wheel A
PA0—— Left wheel B
PA1—— Left wheel A
Encoder reference code :
#include "encoder.h"
/**************************************************************************
The functionality : hold TIM1 Initialize to encoder interface mode
Entrance parameters : nothing
return value : nothing
**************************************************************************/
void Encoder_Init_TIM1(void)
{
TIM_TimeBaseInitTypeDef TIM1_TimeBaseStructure;
TIM_ICInitTypeDef TIM1_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; // port configuration
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // Floating input
GPIO_Init(GPIOA, &GPIO_InitStructure); // Initialize according to the set parameters GPIOA
TIM_TimeBaseStructInit(&TIM1_TimeBaseStructure);
TIM1_TimeBaseStructure.TIM_Prescaler = 0x0; // Preassigned frequency counter
TIM1_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; // Set the counter to automatically reload
TIM1_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;// Select clock division : Regardless of the frequency
TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM Count up
TIM_TimeBaseInit(TIM1, &TIM1_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_ICStructInit(&TIM1_ICInitStructure);
TIM1_ICInitStructure.TIM_ICFilter = 10;
TIM_ICInit(TIM1, &TIM1_ICInitStructure);// according to TIM_ICInitStruct The parameter specified in TIM
TIM_ClearFlag(TIM1, TIM_FLAG_Update);// eliminate TIM Update flag bit
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // To enable or disable specified TIM interrupt
TIM_SetCounter(TIM1,0);
TIM_Cmd(TIM1, ENABLE); // Enable or enable TIMx peripherals
}
void Encoder_Init_TIM2(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// Enable timer 2 The clock of
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// Can make PA Port clock
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; // port configuration PA0 PA1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // Floating input
GPIO_Init(GPIOA, &GPIO_InitStructure); // Initialize according to the set parameters GPIOA
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; // Timer 2 interrupt
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // Can make IRQ passageway
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;// preemption 1
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; // Response priority 3
NVIC_Init(&NVIC_InitStruct);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // Preassigned frequency counter
TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; // Set the counter to automatically reload
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;// Select clock division : Regardless of the frequency
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// Edge count mode
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Initialize the timer
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);// Use encoder mode 3
TIM_ICStructInit(&TIM_ICInitStructure); // hold TIM_ICInitStruct Each parameter in the is filled in by default
TIM_ICInitStructure.TIM_ICFilter = 10; // Set filter length
TIM_ICInit(TIM2, &TIM_ICInitStructure);// according to TIM_ICInitStruct Initialize peripherals with parameters TIMx
TIM_ClearFlag(TIM2, TIM_FLAG_Update);// eliminate TIM Update flag bit
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// Enable timer interrupt
TIM_SetCounter(TIM2,0);
TIM_Cmd(TIM2, ENABLE); // Enable timer
}
/**************************************************************************
The functionality : Read encoder count per unit time
Entrance parameters : Timer
return value : Speed value
**************************************************************************/
int Read_Velocity(u8 TIMX)
{
int Encoder_TIM;
switch(TIMX)
{
case 1: Encoder_TIM= (short)TIM1 -> CNT; TIM1->CNT=0; break;
case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2->CNT=0; break;
default: Encoder_TIM=0;
}
return Encoder_TIM;
}
void TIM1_IRQHandler(void)// The interrupt handling function is empty , Clear the interrupt flag and end the interrupt
{
if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET)// Overflow interrupt
{
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); // Clears the interrupt flag bit
}
void TIM2_IRQHandler(void)// The interrupt handling function is empty , Clear the interrupt flag and end the interrupt
{
if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET)// Overflow interrupt
{
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); // Clears the interrupt flag bit
}
Refer to the main function :
#include "stm32f10x.h"
#include "lcd.h"
#include "delay.h"
#include "remote.h"
#include "motor.h"
#include "key.h"
#include "led.h"
#include "usart.h"
#include "encoder.h"
#define MAXSPEED 7000
#define MINSPEED 1000
#define FILTERNUM 20
int main(void)
{
u8 Remote_key;// Remote control key value
u8 Key;// Key value
u8 *str=0;// The remote control displays
u16 speed=1000;
u16 PWM=0;
u16 filter=FILTERNUM;
int Encoder_TIM=0;
delay_init(); // Delay function initialization
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // Set up NVIC Interrupt grouping 2:2 Bit preemption priority ,2 Bit response priority
uart_init(115200); // The serial port is initialized to 115200
LCD_Init();// initialization LCD function ; 320*240
Remote_Init(); // Infrared receiving initialization
LED_Init(); //LED Port initialization
//TIM3_PWM_Init(7199,0); // Regardless of the frequency .PWM frequency =72000000/900=80Khz
PWM_Init(7199,0);
KEY_Init();
CAR_Gpio_Init();
Encoder_Init_TIM1();
Encoder_Init_TIM2();
LCD_ShowString(30,60,300,16,16,"My RoBot");
LCD_ShowString(30,80,300,16,16,"MOTOR TEST:");
LCD_ShowString(30,100,300,16,16,"PWM: %");
MOTO(PosMode);
CAR_Speed(speed);// set speed
while(1){
Encoder_TIM=Read_Velocity(1);
LCD_ShowxNum(30, 120,Encoder_TIM , 4, 16,0);
USART_SendData(USART2,Encoder_TIM);
//printf("TIM1=%d\n\r",Encoder_TIM);
Encoder_TIM=Rea/d_Velocity(2);
//printf("TIM2=%d\n\r",Encoder_TIM);
USART_SendData(USART2,Encoder_TIM);
LCD_ShowxNum(30, 140,Encoder_TIM , 4, 16,0);
Remote_key=Remote_Scan();
Key=KEY_Scan(0);
//TIM_SetCompare2(TIM3,led0pwmval);
if(Remote_key)
{ switch(Remote_key)
{
case 0:str="ERROR";break;
case 162:
str="STOP";
MOTO(StopMode);
break;
case 98:str="UP";break;
case 2:str="PLAY";break;
case 226:
str="Go!";
MOTO(PosMode);
break;
case 194:str="RIGHT";break;
case 34:str="LEFT";break;
case 224:
str="VOL-";
filter--;
if(!filter){
filter=FILTERNUM;
speed-=1000;
if(speed<1000){
speed=MINSPEED;
}
}
break;
case 168:str="DOWN";break;
case 144:
str="VOL+";
filter--;
if(!filter){
filter=FILTERNUM;
speed+=500;
if(speed>7000){
speed=MAXSPEED;
}
}
break;
case 104:str="1";break;
case 152:str="2";break;
case 176:str="3";break;
case 48:str="4";break;
case 24:str="5";break;
case 122:str="6";break;
case 16:str="7";break;
case 56:str="8";break;
case 90:str="9";break;
case 66:str="0";break;
case 82:str="DELETE";break;
}
}else delay_ms(10);
if(Key==KEY0_PRES){// Slow down
speed-=1000;
if(speed<1000){
speed=MINSPEED;
}
}else if(Key==KEY1_PRES){
// Speed up
speed+=500;
if(speed>7000){
speed=MAXSPEED;
}
}
CAR_Speed(speed);
LCD_Fill(30+12*8,80,300,80+16,WHITE); // Clear the previous display
LCD_ShowString(30+12*8,80,300,16,16,str); // Show SYMBOL
PWM=speed*100/7200;
LCD_ShowNum(30+4*8, 100, PWM, 2, 16);
}
}
边栏推荐
- 如何用一款产品推动「品牌的惊险一跃」?
- MySQL主从延迟问题怎么解决
- Openssl3.0 learning XXI provider encoder
- The role of artificial intelligence in network security
- 剑指 Offer II 031. 最近最少使用缓存
- 734. Energy stone (greed, backpack)
- leetcode2309. The best English letters with both upper and lower case (simple, weekly)
- CSDN insertion directory in 1 second
- leetcode373. Find and minimum k-pair numbers (medium)
- 【C#】使用正则校验内容
猜你喜欢

Cross domain? Homology? Understand what is cross domain at once

跨域?同源?一次搞懂什么是跨域

The concepts and differences between MySQL stored procedures and stored functions, as well as how to create them, the role of delimiter, the viewing, modification, deletion of stored procedures and fu

mysql列转行函数指的是什么

剑指 Offer 62. 圆圈中最后剩下的数字

MySQL约束与多表查询实例分析

pytest 测试框架

开发工具创新升级,鲲鹏推进计算产业“竹林”式生长

With the innovation and upgrading of development tools, Kunpeng promotes the "bamboo forest" growth of the computing industry

A quick understanding of analog electricity
随机推荐
np.where 和 torch.where 用法
leetcode2309. 兼具大小写的最好英文字母(简单,周赛)
2022 Q2 - résumé des compétences pour améliorer les compétences
剑指 Offer 47. 礼物的最大价值
[技术发展-21]:网络与通信技术的应用与发展快速概览-1- 互联网网络技术
Implementation principle of city selector component
Open that kind of construction document
How to build and use redis environment
How to execute an SQL in MySQL
C language 3-7 daffodils (enhanced version)
leetcode2312. 卖木头块(困难,周赛)
How can the tsingsee Qingxi platform play multiple videos at the same time on the same node?
With the innovation and upgrading of development tools, Kunpeng promotes the "bamboo forest" growth of the computing industry
Using mongodb in laravel
如何远程、在线调试app?
[Video] visual interpretation of Markov chain principle and Mrs example of R language region conversion | data sharing
[C #] use regular verification content
leetcode2310. The one digit number is the sum of integers of K (medium, weekly)
MySQL constraints and multi table query example analysis
The concept, function, characteristics, creation and deletion of MySQL constraints