欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > stm32单片机个人学习笔记8(TIM输出比较)

stm32单片机个人学习笔记8(TIM输出比较)

2024/10/25 19:34:15 来源:https://blog.csdn.net/2302_80867398/article/details/142497502  浏览:    关键词:stm32单片机个人学习笔记8(TIM输出比较)

前言

本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

一、输出比较

1.简介

2.输出比较通道

3.输出比较模式

二、PWM

1.基本结构

2.参数计算

三、舵机

1.简介

2.硬件电路

四、直流电机驱动(TB6612)

1.简介

2.硬件电路

 

VM为驱动电压输入端,这个电压一般与电机的额定电压一致

VCC为逻辑电平输入端,这个要和控制器的电源一致 

五、实例一(PWM驱动LED呼吸灯)

1.初始化时基单元

2.初始化输出比较

3.配置GPIO定时器输出PWM波的引脚(设置为复用推挽输出,因为该模式下才能由片上外设控制GPIO口,不然普通推挽输出下是由输出寄存器控制GPIO口)

PWM.c 

#include "stm32f10x.h"                  // Device headervoid PWM_Init(void)
{//开启内部时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//GPIO口初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//设置为内部时钟模式TIM_InternalClockConfig(TIM2);//时基单元初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//输出比较模初始化TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&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;						//CCRTIM_OC1Init(TIM2, &TIM_OCInitStructure);//运行控制,启动定时器TIM_Cmd(TIM2, ENABLE);
}void PWM_SetCompare1(uint16_t Compare)
{TIM_SetCompare1(TIM2, Compare);
}

 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"uint8_t i;int main(void)
{OLED_Init();PWM_Init();while (1){for (i=0;i<100;i++){PWM_SetCompare1(i);Delay_ms(10);}for (i=0;i<100;i++){PWM_SetCompare1(100-i);Delay_ms(10);}}
}

AFIO引脚重映射功能 

1.开启AFIO时钟

2.选择重映射模式

	//AFIO重映射RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

 在PWM.c中添加这一句即可

六、实例二(PWM驱动舵机) 

PWM.c模块不需要更改,只要封装一个舵机模块即可

Servo.c 

#include "stm32f10x.h"                  // Device header
#include "PWM.h"void Servo_Init(void)
{PWM_Init();
}void Servo_SetAngle(float Angle)
{PWM_SetCompare2(Angle/180*2000+500);
}

 七、实例三(PWM驱动直流电机)

Motor.c

根据速度的正负来判断电机正转还是反转

#include "stm32f10x.h"                  // Device header
#include "PWM.h"void Motor_Init(void)
{PWM_Init();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}void Motor_SetSpeed(int8_t Speed)
{if (Speed>=0){GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare1(Speed);}else{GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_ResetBits(GPIOA,GPIO_Pin_4);PWM_SetCompare1(-Speed);}
}

 main.c

按键可以用来调速度 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"int8_t Speed;
uint8_t KeyNum;int main(void)
{OLED_Init();Motor_Init();Key_Init();OLED_ShowString(1,1,"Speed:");while (1){KeyNum = Key_GetNum();if (KeyNum == 1){Speed += 20;if (Speed > 100){Speed = -100;}}Motor_SetSpeed(Speed);OLED_ShowSignedNum(2,1,Speed,3);}
}

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com