STM32(六):定时器——输出比较实验

devtools/2025/1/16 7:52:55/

PWM驱动呼吸灯

 源码:

#include "stm32f10x.h"                  // Device headervoid PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟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;//ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//预分频器的值 72MHz/7200/10000=1TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才需要,目前不需要用给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);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_Cmd(TIM2,ENABLE);//开启定时器;}void PWM_SetCompare1(uint16_t Compare)
{TIM_SetCompare1(TIM2,Compare);}

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出比较的极性

输出比较的极性问题:

        high是代表0,即电平信号不反转,low代表电平信号翻转。

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//选择复用推挽输出 

选择复用推挽输出的原因:

        对于普通的开漏推挽输出,引脚的控制权来自于输出寄存器的,如果想让定时器来控制引脚,那就需要使用复用开漏/推挽输出,在这里输出寄存器将被断开,输出控制将转移给片上外设。

引脚重映射:

         引脚定义表里可以看到,TIM2的CH1可以从PA0挪到PA15上,进行引脚重映射需要用到AFIO,开启AFIO时钟。

引脚定义表中为加粗的就是默认有接口复用的,如果该Pin口想做GPIO口使用,先用GPIO_PinRemapConfig函数给取消复用,然后才能继续使用。 

参数详解:

        GPIO_Remap_SWJ_NoJTRST: SWJ是SWD和JTAG两种调试方式,NOJTRST意思是接触JTRST引脚的复用,根据引脚定义表,JTRST引脚也就是PB4,如果使用这个参数,PB4就变成正常的GPIO口了,上图其他四个还是调试端口,不能当作GPIO来使用。

        GPIO_Remap_SWJ_JTAGDisable:解除JTAG调试端口的复用,PA15,PB3,PB4三个端口变为GPIO,上面的PA13和PA14仍尾SWD的调试端口。

        GPIO_Remap_SWJ_Disable:五个引脚全部变为普通的GPIO,没有调试功能。

调试端口使用要小心!解除调试接口后,STLINK就下载不进去程序了。

PWM驱动舵机

源码:

#include "stm32f10x.h"                  // Device headervoid PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟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=20000-1;//ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//预分频器的值 72MHz/7200/10000=1TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才需要,目前不需要用给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;//设置CCR500-2500=0.5-2.5msTIM_OC2Init(TIM2,&TIM_OCInitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//选择复用推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);TIM_Cmd(TIM2,ENABLE);//开启定时器;}void PWM_SetCompare2(uint16_t Compare)
{TIM_SetCompare2(TIM2,Compare);}
#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驱动直流电机

源码

#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_5 | GPIO_Pin_4;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_5);GPIO_ResetBits(GPIOA,GPIO_Pin_4);PWM_SetCompare3(speed);}else{GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(-speed);}
}


http://www.ppmy.cn/devtools/100281.html

相关文章

【Linux —— 线程互斥】

Linux —— 线程互斥 1. 临界资源与临界区2. 互斥的定义3. 原子性4. 互斥量(Mutex)5. 互斥的实现示例6. 互斥量实现原理探究 1. 临界资源与临界区 临界资源: 指的是多个线程或进程共享的资源,例如全局变量、文件、数据库等。由于这些资源的共享,可能会导…

SQL注入漏洞WAF绕过

目录 如何检测和防范SQL注入攻击中的编码伪装? 检测SQL注入攻击中的编码伪装 防范SQL注入攻击中的编码伪装 WAF在处理SQL注入时为什么有时会对大小写不敏感? SQL注入中的联合查询注入有哪些常见的攻击方式? 在绕过Web应用防火墙&#xf…

Linux文件目录系统

Linux文件目录是Linux操作系统中用于组织和存储文件及子目录的层次结构。这个结构从根目录(/)开始,向下分支出多个子目录,每个子目录又可以包含更多的文件和子目录,形成一棵倒置的树状结构。以下是Linux文件目录的一些…

动态库和静态库(.so/dll,.a/lib)

目录 一、库的概念 二、库的分类 1.动态库 2.静态库 三、查看所依赖的动静态库 四、制作、发布与使用静态库 1.制作并发布静态库 2.使用静态库 五、制作、发布与使用动态库 1.制作并发布动态库 2.使用动态库 六、总结 在一个大型的项目中,我们可以使用别…

tornado一个请求对应一个实例

在Tornado框架中,关于请求处理与实例创建的行为,主要取决于你是如何组织你的Tornado应用的。通常,Tornado本身并不直接为每个请求新建一个类的实例,而是使用了一种称为“RequestHandler”的机制来处理请求。 基本的RequestHandle…

【Linux】Vim编辑器基本指令

关于VIM Vim编辑器是一个强大的文本编辑工具 虽然对于外行人而言,它远没有SublimeText和Notepad这些强大,甚至比不上Window的记事本 但其实它们定位有所区别,Vim更多用于命令行环境当中,显然其它文本的编辑工具并不适合这种场景…

本题要求编写程序,计算并输出2个正整数的和、差、积、商。题目保证输入和输出全部在整型范围内。

/* 题目描述 本题要求编写程序&#xff0c;计算并输出2个正整数的和、差、积、商。 题目保证输入和输出全部在整型范围内。 输入 输入在一行中给出2个正整数A和B。 输出 在4行中按照格式“A 运算符 B 结果”顺序输出和、差、积、商。 */ #include<stdio.h> #inclu…

C++篇:C向C++迈进(上)

引言 C语言作为编程基石&#xff0c;其高效与直接性深受开发者喜爱。然而&#xff0c;随着软件复杂度的增加&#xff0c;C以其面向对象及高级特性成为了新的选择。我们接下来将学习C&#xff0c;从C语言迈向C。 什么是C C 是一种高级语言&#xff0c;由 Bjarne Stroustrup 于…