IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 定时器同步 触发 代码 实验 验证分享 -> 正文阅读

[嵌入式]STM32 定时器同步 触发 代码 实验 验证分享

这里使用STM32F407型号,其它版本可能略有区别

定时器同步可以用来BLDC的HALL、ENCODER、内部时钟相位一致

定时器同步触发:

主定时器配置:

1、TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);

TIMx:根据数据手册决定,看表76/72,这里我们选择TIM4

?

TIM_TRGOSource:输出触发源选项

TIM_TRGOSource_Reset??

TIM_TRGOSource_Enable?

TIM_TRGOSource_Update?

TIM_TRGOSource_OC1????

TIM_TRGOSource_OC1Ref?

TIM_TRGOSource_OC2Ref?

TIM_TRGOSource_OC3Ref?

TIM_TRGOSource_OC4Ref?

有8个选项,TIM_TRGOSource_OC1~TIM_TRGOSource_OC4Ref是OC输出,这里实验时采用PWM,可以的没问题;这里我们实验选择TIM_TRGOSource_OC1Ref

TIM_TRGOSource_Enable这一项也验证了,可以触发;

至于TIM_TRGOSource_Reset和TIM_TRGOSource_Update? 这两项未能成功验证,反复试了很多方法,还是不行,现象:一上电,就触发了,根本不能控制

具体见手册,如下图

2、void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode);

TIMx:和上面保持一致

TIM_MasterSlaveMode:2个选项

TIM_MasterSlaveMode_Enable?

TIM_MasterSlaveMode_Disable

这里使用TIM_MasterSlaveMode_Enable? 使能主从模式

从定时器配置:

void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

TIMx:参照表格76/72来确定,这里选择TIM5实验

TIM_InputTriggerSource:

TIM_TS_ITR0??

TIM_TS_ITR1??

TIM_TS_ITR2??

TIM_TS_ITR3??

TIM_TS_TI1F_ED

TIM_TS_TI1FP1

TIM_TS_TI2FP2

TIM_TS_ETRF??

选择输入触发源,TIM_TS_ITR0~ TIM_TS_ITR3是表格76/72来确定的,和主定时器保持一致,这里我们选择TIM_TS_ITR2(即触发源是定时器4)

TIM_TS_TI1F_ED:一般用来bldc霍尔输入来触发的

TIM_TS_TI1FP1

TIM_TS_TI2FP2:这2个检测 编码器信号输入触发的

TIM_TS_ETRF:外部触发

这些验证没有问题

具体参数意义见手册,如下图

void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);

TIMx:上同

TIM_SlaveMode:

TIM_SlaveMode_Reset??? :复位

TIM_SlaveMode_Gated???? :门控

TIM_SlaveMode_Trigger?? :触发

TIM_SlaveMode_External1? :外部

从定时器模式选择,这里反复实验验证TIM_SlaveMode_Gated、 TIM_SlaveMode_External1

没有问题

至于TIM_SlaveMode_Reset只对TI1有效,即定时器输入1通道和TIM_SlaveMode_Trigger只对TI2有效,即定时器输入2通道,都是适用于外部信号触发,比如hall,编码器,按键;见下图

?

详细见手册,如下图

详细见手册,如下图

下面示意2种同步代码

代码1:触发输出采用TIM_TRGOSource_Enable?

触发输入采用TIM_SlaveMode_Gated

//从定时器

void ????? Tim5_init(void)

{

?????? TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStre;

?????? NVIC_InitTypeDef NVIC_InitStre;

??????

?????? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

?????? TIM_ITConfig(TIM5,TIM_IT_Update,DISABLE);

?????? TIM_Cmd(TIM5, DISABLE);

??????

?????? //计数频率100Hz=84/(TIM_Prescaler+1)/(TIM_Period+1)

?????? TIM_TimeBaseInitStre.TIM_Prescaler=84-1;//定时器频率84M/(840)=1us

?????? TIM_TimeBaseInitStre.TIM_Period=50000-1;//周期计数值500 T=200Hz=5ms?

?????? TIM_TimeBaseInitStre.TIM_ClockDivision=0x00;//不分频

?????? TIM_TimeBaseInitStre.TIM_CounterMode=TIM_CounterMode_Up ;

?????? TIM_TimeBaseInitStre.TIM_RepetitionCounter=0;

?????? TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStre);

??????

?????? TIM_SelectSlaveMode(TIM5,TIM_SlaveMode_Gated);

?????? TIM_SelectInputTrigger(TIM5,TIM_TS_ITR2);//设置输入触发源

?????? NVIC_InitStre.NVIC_IRQChannel=TIM5_IRQn;

?????? NVIC_InitStre.NVIC_IRQChannelPreemptionPriority=0x02;

?????? NVIC_InitStre.NVIC_IRQChannelSubPriority=0x01;

?????? NVIC_InitStre.NVIC_IRQChannelCmd=ENABLE;

?????? NVIC_Init(&NVIC_InitStre);//初始化

?????? TIM_ClearITPendingBit(TIM5,TIM_IT_Update);

??????

?????? TIM_ARRPreloadConfig(TIM5, ENABLE);//使能自动装载

?????? TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);????

?????? TIM_ClearITPendingBit(TIM5,TIM_IT_Update);

??????

?????? TIM_Cmd(TIM5, ENABLE);//使能时钟,

}

//主触发器

void ????? Tim4_init(void)

{

?????? TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStre;

?????? NVIC_InitTypeDef NVIC_InitStre;

??????

?????? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

?????? TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE);

?????? TIM_Cmd(TIM4, DISABLE);

??????

?????? //计数频率100Hz=84/(TIM_Prescaler+1)/(TIM_Period+1)

?????? TIM_TimeBaseInitStre.TIM_Prescaler=84-1;//定时器频率84M/(840)=1us

?????? TIM_TimeBaseInitStre.TIM_Period=50000-1;//周期计数值500 T=200Hz=5ms?

?????? TIM_TimeBaseInitStre.TIM_ClockDivision=0x00;//不分频

?????? TIM_TimeBaseInitStre.TIM_CounterMode=TIM_CounterMode_Up ;

?????? TIM_TimeBaseInitStre.TIM_RepetitionCounter=0;

?????? TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStre);

??????

?????? TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Enable);//设置输入触发源

?????? TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);//使能主从模式

??????

?????? NVIC_InitStre.NVIC_IRQChannel=TIM4_IRQn;

?????? NVIC_InitStre.NVIC_IRQChannelPreemptionPriority=0x02;

?????? NVIC_InitStre.NVIC_IRQChannelSubPriority=0x03;

?????? NVIC_InitStre.NVIC_IRQChannelCmd=ENABLE;

?????? NVIC_Init(&NVIC_InitStre);//初始化

?????? TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

??????

?????? TIM_ARRPreloadConfig(TIM4, ENABLE);//使能自动装载

?????? TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);????

?????? TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

??????

?????? //TIM_Cmd(TIM4, ENABLE);//使能时钟,不要在这里使能

}

//我这里使用串口指令来使能定时器

Void Main_Time(vodi)

{

TIM_Cmd(TIM4 ENABLE);//在这里使能

}

//定时器5中断服务函数

void TIM5_IRQHandler(void)

{

????????????? ?????? if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)

?????? {

GPIO_WriteBit(GPIOA,GPIO_Pin_11,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_11)));//LED

????????????? TIM_ClearITPendingBit(TIM5,TIM_IT_Update);//清除中断

?????? }

}

实验现象是,上电后,定时器5不被触发,led不闪烁

串口指令使能主定时器后,定时器5被触发,led闪烁

代码2:触发输出采用TIM_TRGOSource_OC3Ref

触发输入采用TIM_SlaveMode_Gated

//从定时器

void ????? Tim5_init(void)

{

?????? TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStre;

?????? NVIC_InitTypeDef NVIC_InitStre;

??????

?????? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

?????? TIM_ITConfig(TIM5,TIM_IT_Update,DISABLE);

?????? TIM_Cmd(TIM5, DISABLE);

??????

?????? //计数频率100Hz=84/(TIM_Prescaler+1)/(TIM_Period+1)

?????? TIM_TimeBaseInitStre.TIM_Prescaler=84-1;//定时器频率84M/(840)=1us

?????? TIM_TimeBaseInitStre.TIM_Period=50000-1;//周期计数值500 T=200Hz=5ms?

?????? TIM_TimeBaseInitStre.TIM_ClockDivision=0x00;//不分频

?????? TIM_TimeBaseInitStre.TIM_CounterMode=TIM_CounterMode_Up ;

?????? TIM_TimeBaseInitStre.TIM_RepetitionCounter=0;

?????? TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStre);

??????

?????? TIM_SelectSlaveMode(TIM5,TIM_SlaveMode_Gated);//从模式配置?

?????? TIM_SelectInputTrigger(TIM5,TIM_TS_ITR3);//设置输入触发源

?????? //TIM_SelectMasterSlaveMode(TIM5,TIM_MasterSlaveMode_Enable);//使能主从模式

??????

?????? NVIC_InitStre.NVIC_IRQChannel=TIM5_IRQn;

?????? NVIC_InitStre.NVIC_IRQChannelPreemptionPriority=0x02;

?????? NVIC_InitStre.NVIC_IRQChannelSubPriority=0x01;

?????? NVIC_InitStre.NVIC_IRQChannelCmd=ENABLE;

?????? NVIC_Init(&NVIC_InitStre);//初始化

?????? TIM_ClearITPendingBit(TIM5,TIM_IT_Update);

??????

?????? TIM_ARRPreloadConfig(TIM5, ENABLE);//使能自动装载

?????? TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);????

?????? TIM_ClearITPendingBit(TIM5,TIM_IT_Update);

??????

?????? TIM_Cmd(TIM5, ENABLE);//使能时钟 //中断配置

}

//主定时器

void Tim8_init(void)

{

?????? TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStre;

?????? TIM_OCInitTypeDef TIM_OCInitStre;

??????

?????? RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

?????? PV_PEEP_IO_Init();//IO口初始化

??????

?????? //计数频率20kHz=168/(TIM_Prescaler+1)/(TIM_Period+1)

?????? TIM_TimeBaseInitStre.TIM_Prescaler=0;//定时器频率168M/(0+1)

?????? TIM_TimeBaseInitStre.TIM_Period=11200-1;//周期计数值 15k-11200? 一个计数值 改成20kHz-8400

?????? TIM_TimeBaseInitStre.TIM_ClockDivision=0x00;//不分频

?????? TIM_TimeBaseInitStre.TIM_CounterMode=TIM_CounterMode_CenterAligned1;

?????? TIM_TimeBaseInitStre.TIM_RepetitionCounter=0;

?????? TIM_TimeBaseInit(TIM8, &TIM_TimeBaseInitStre);

??????

?????? TIM_OCInitStre.TIM_OCMode=TIM_OCMode_PWM1;

?????? TIM_OCInitStre.TIM_Pulse=0;//占空比0%

?????? TIM_OCInitStre.TIM_OCPolarity=TIM_OCPolarity_High ;

?????? TIM_OCInitStre.TIM_OutputState=TIM_OutputState_Enable ;

?????? TIM_OCInitStre.TIM_OCIdleState=TIM_OCIdleState_Reset ;

?????? TIM_OC3Init(TIM8, &TIM_OCInitStre);//消音圈

??????

?????? TIM_SelectOutputTrigger(TIM8,TIM_TRGOSource_OC3Ref);//触发输出源OC3

?????? TIM_SelectMasterSlaveMode(TIM8,TIM_MasterSlaveMode_Enable);//使能主从模式

??????

?????? TIM_CtrlPWMOutputs(TIM8, ENABLE);//高级定时器要加这个使能

?????? TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);

? TIM_Cmd(TIM8, ENABLE);//使能时钟

}

//串口更改占空比

Void Set_CCR(void)

{

TIM8->CCR3=1000;

}

实验现象,开始占空比等于0,定时器5不被触发,led不闪烁;

使用串口发送指令,更改占空比,定时器5被触发,led闪烁

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:48:03  更:2021-10-16 19:49:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:53:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码