STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置
基本流程:
1.配置定时器
2.开启定时器
3.动态改变pwm输出,改变值
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
函数总结:
__HAL_TIM_SET_COMPARE() // 是设置CCRx,一般是用在PWM输出的,控制PWM占空比
__HAL_TIM_GET_COMPARE // 是用来读取CCRx的,一般用于捕获处理
PWM输出配置:

频率设置:
static void MX_TIM2_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
TIM_IC_InitTypeDef sConfigIC;
TIM_OC_InitTypeDef sConfigOC;
htim2.Instance = TIM2;
htim2.Init.Prescaler = (-); //实际时钟频率为 72M/36=2MHz /40000=50H,-----490HZ,改变观察电机输出状态 定时器预分频器
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = (-); //定时器周期配置 PWM频率为 490KHz 定义定时器周期,PWM频率为:168MHz/ (L298N_TIMx_PRESCALER+1)/ (L298N_TIM_PERIOD+1) htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频
//高级定时器重复计数寄存器值
**高级才有
// 定义高级定时器重复计数寄存器值
//实际PWM频率为:72MHz/(L298N_TIMx_PRESCALER+1)/(L298N_TIM_PERIOD+1)/(L298N_TIM_REPETITIONCOUNTER+1)
#define L298N_TIM_REPETITIONCOUNTER 0
**
刹车和死区配置:
/* 刹车和死区时间配置 */
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = ;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
HAL_TIMEx_ConfigBreakDeadTime(&htimx_L298N, &sBreakDeadTimeConfig);
基于通信的pwm频率和脉宽的更新控制算法:
/*
** pwm是否需要更新,比较上一次的频率和脉宽值,如果不同,则更新
*/
void pwm_update_loop( void )
{
/*1,第一路判断: 频率 或 占空比发生变化 */
if( (HLM_SOKO_I_FREQ != HLM_SOKO_I_FREQ_LAST ) ||
HLM_SOKO_I_DUTY != HLM_SOKO_I_DUTY_LAST )
{
/* 更新 频率和占空比的记录值 */
HLM_SOKO_I_FREQ_LAST = HLM_SOKO_I_FREQ;
HLM_SOKO_I_DUTY_LAST = HLM_SOKO_I_DUTY;
/* 更新当前通道的PWM波形 */
pwm_update( PWM_I,HLM_SOKO_I_FREQ, HLM_SOKO_I_DUTY );
} /*2,第二路判断 */
if( (HLM_SOKO_II_FREQ != HLM_SOKO_II_FREQ_LAST ) ||
HLM_SOKO_II_DUTY != HLM_SOKO_II_DUTY_LAST )
{
/* 更新 频率和占空比的记录值 */
HLM_SOKO_II_FREQ_LAST = HLM_SOKO_II_FREQ;
HLM_SOKO_II_DUTY_LAST = HLM_SOKO_II_DUTY;
/* 更新当前通道的PWM波形 */
pwm_update( PWM_II,HLM_SOKO_II_FREQ, HLM_SOKO_II_DUTY );
} /*3,第三路判断 */
if( (HLM_SOKO_III_FREQ != HLM_SOKO_III_FREQ_LAST ) ||
HLM_SOKO_III_DUTY != HLM_SOKO_III_DUTY_LAST )
{
/* 更新 频率和占空比的记录值 */
HLM_SOKO_III_FREQ_LAST = HLM_SOKO_III_FREQ;
HLM_SOKO_III_DUTY_LAST = HLM_SOKO_III_DUTY;
/* 更新当前通道的PWM波形 */
pwm_update( PWM_III,HLM_SOKO_III_FREQ, HLM_SOKO_III_DUTY );
}
}
补充:
开起定时器功能
只要在相应的定时器下开始内部时钟源即可使用定时器功能

定时器内部动能:

定时器时钟配置:
M是10的6次方
微秒是10的-6次方
内部时钟设置为不分频(CKD),则CK_PSC的时钟频率等于APB1的时钟频率108MHz,即108000 000Hz。若要定时时间为1s,则即可设置10800分频(预分频器寄存器 (TIMx_PSC)的值为10800-1),定时器的时钟CK_CNT的频率为10000Hz.则自动重载寄存器 (TIMx_ARR)设置为10000-1即定时为1s.TRGO为触发输出,可以触发内部ADC/DAC,这里我们没有用到这个功能,参数为默认设置。

STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置的更多相关文章
- STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error: #20: identifier "TIM_ICPOLARITY_BOTHEDGE" ...
- STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置
ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...
- STM32 HAL库学习系列第6篇---定时器TIM 级联配置
应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...
- STM32 HAL库学习系列第8篇---回调函数总结
普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...
- STM32 HAL库学习系列第3篇 常使用的几种延时方式
1 自带的hal_delay 函数 毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...
- STM32 HAL库学习系列第2篇 GPIO配置
GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...
- STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能
测量脉冲宽度或者测量频率 基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0], ...
- STM32 HAL库学习系列---定时器TIM 输入捕获功能
基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后 ...
- 【书籍连载】《STM32 HAL 库开发实战指南—基于F7》-第一章
从今天起,每天开始连载一章<STM32 HAL 库开发实战指南—基于F7>.欢迎各位阅读.点评.学习. 第1章 如何使用本书 1.1 本书的参考资料 本书参考资料为:<STM32 ...
随机推荐
- java笔记--ASCII编码认知和转换
ASCII是基于拉丁字母的一套电脑编码系统,主要用于显示英语字符是当今最通用的单字节编码.包括128个字符. --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs. ...
- 将eChart图片利用POI导出到Excel
在使用POI进行将数据导出到Excel时, 若要将eChart在前端生成的统计图(如柱状图.折线图.饼图等)一并导出,使用POI在后台构建数据图比较复杂,因此我选择将eChart在前端的统计图的bas ...
- ZT extern "C"的用法解析
extern "C"的用法解析 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同. ...
- codeforces 703E Mishka and Divisors
codeforces 703E Mishka and Divisors 题面 给出大小为\(1000\)的数组和一个数\(k\),求长度最短的一个子序列使得子序列的元素之积是\(k\)的倍数,如果有多 ...
- 理解活在Iphone中的那些App (三)
App的生存环境之宏观环境 从用户需求变成一个产品形体的App,是一个曲折的过程.主要的过程大概如此,分析用户需求,从用户需求中提炼出比较重要的部分,然后结合自己的创意,将其转化成产品.投放市场,接受 ...
- CentOS7.X安装Redis-4.0.8以及Redis集群搭建
安装redis 安装前的准备 yum install \ vim \ wget \ make \ gcc \ gcc-c++ \ automake \ autoconf \ -y \ 下载解压并安装 ...
- Python自动化之Django中间件
django中间件 Django请求生命周期 中间件中可以定义方法,分别是 process_request(self,request) process_view(self, request, call ...
- 第2章 K近邻算法
numpy中的tile函数: 遇到numpy.tile(A,(b,c))函数,重复复制A,按照行方向b次,列方向c次. >>> import numpy >>> n ...
- Http_load的安装和使用
Http_load的安装和使用 http_load基于linux平台的一种性能测工具.以并行复用的方式运行,用以测试web服务器的吞吐量与负载,测试web页面的性能. 安装: 进入工作目录:#cd / ...
- ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)
这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下. row_number()over(partition by ...