基于stm32f103zet6(精英版)vct6 vet6的通用定时器(TIM2~TIM5)的pwm输出
PWM的基础知识我就不多说,主要说怎样用各个通用定时器去输出各个通道的pwm。
先说TIM2的·参考F103.的中文参考手册可以知到TIM2共有四种复用映像方式:没有重映像、部分重映像1、部分重映像2、完全重映像
'没有重映像'怎么写
void TIM2_PWM_Init(u16 arr,u16 psc)
{ GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设
这部分没啥说的,然后就是 初始化它重映像对应的几个IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3; //TIM_CH1 2 3 4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
之后就是初始化TIM2
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
接着就是初始化它的通道 以及PWM模式(PWM1 CNT>CCRS时为低电平)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIMX OCXTIM_OC1Init(TIM2, &TIM_OCInitStructure);TIM_OC3Init(TIM2, &TIM_OCInitStructure);TIM_OC4Init(TIM2, &TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
最后使能时钟
TIM_Cmd(TIM2, ENABLE);
这样的话主函数就可以直接调用
int main(void){ u16 led0pwmval=3600;TIM2_PWM_Init(7200,49); while(1){
TIM_SetCompare2(TIM2,led0pwmval);
TIM_SetCompare1(TIM2,led0pwmval);
TIM_SetCompare3(TIM2,led0pwmval);
TIM_SetCompare4(TIM2,led0pwmval); } }
之后改变各个通道的比较值就能输出相同周期不同占空比的pwm
部分重映像1
void TIM2_PWM_Init(u16 arr,u16 psc)
{ GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器3时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
因为这个时候用到了映像这个时候我们就需要调用GPIO_PinRemapConfig()这个函数来设置它的映像模式
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //Timer2部分重映射1
这个就是TIM2的几种映像模式
在TIM2的部分映射1模式下参考第一张图 它的通道1到4对应的引脚为A15、B3、A2、A3接着就是初始化这几个IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
剩余的跟‘没有重映像’代码一样
然后问题来了 你就会发现PB3和PA15它不能输出PWM波(PA2和PA3正常输出)
然后就一直找不到问题,正好这段时间在画VCT6(跟zet6和vet6我感觉它们都是一样的)的PCB就发现这两个引脚与JTAG有关
然后就在网上找发现这两个引脚不能直接用,需要
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
这个函数去吧JTAG功能禁用,然后四个通道也都能输出PWM了。
(注:图中的映像模式为全映射)
其他映射模式以及其他的通用定时器输出pwm都跟以上的的写法是一样的。
基于stm32f103zet6(精英版)vct6 vet6的通用定时器(TIM2~TIM5)的pwm输出相关推荐
- STM32通用定时器输出带死区互补PWM/任意移相PWM
项目上遇到了多个通道的带死区的互补功能,单纯靠H7的TIM1/TIM8/TIM15/TIM16/TIM17几个硬件自带的死区互补还不够,本文就使用通用定时器TIM2/TIM3/TIM4/TIM5来实现 ...
- STM32学习笔记 通用定时器TIM3~TIM5 13
通用定时器TIM3~TIM5 TIM3~TIM5简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出 ...
- 【STM32】通用定时器(TIM2到TIM5)
00. 目录 文章目录 00. 目录 01. 通用定时器简介 02. TIM2到TIM5主要特性 03. TIM2到TIM5功能说明 04. 时钟选择 05. 寄存器 5.1 TIMx 控制寄存器 1 ...
- 基于STM32的HAL库的倒立摆控制(一)PWM输出
一 TIM初始化 首先初始化PWM引脚,在这里使用的是TIM4的ch3,设置PD14为复用输出,并连接到TIM4 GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitS ...
- 【正点原子STM32连载】第二十一章 通用定时器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- stm32关于通用定时器的周期、频率计算公式
以下内容针对正点原子的定时器中断实验 定时器时基单元包含: ● 计数器寄存器(TIMx_CNT) ● 预分频器寄存器 (TIMx_PSC)--该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器 ...
- STM32学习笔记:通用定时器输出PWM
脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度.电机转速等. STM32 的定时 ...
- 基于STM32F103ZET6库函数PWM输出实验
基于STM32F103ZET6库函数PWM输出实验 PWM 简介 硬件设计 软件设计 使 用 TIM3 的通道 2,把通道 2 重映射到 PB5,产生 PWM 来控制 DS0 的亮度. PWM 简介 ...
- STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)
目录 定时器 8个定时器 定时器功能 定时器中断 常用通用定时器的寄存器 定时器中断实验目的: 定时器库函数及步骤 实验程序讲解 PWM 简介 STM32 PWM工作过程 PWM模式1 与 PWM模式 ...
最新文章
- js设置ajax执行顺序,2018-03-10fiddler替换js、js的ajax方法执行顺序
- was服务器里面jar包_was8.5.5.9项目部署失败,出现mybatis的jar包异常
- 取代浏览器插件调试,VS Code 整合 JS 调试工具
- python用于标识类方法的是_Python类的设计与使用
- 超难的75道逻辑思维题
- 【通信原理 入坑之路】—— 仔细聊聊关于“采样”的那点事儿
- 【MySQL】Mcafee审计插件
- 机器学习 数据预处理之特征编码(归纳整理版)
- Web前端html中通过CSS来设置div背景颜色透明度
- python模拟计算器程序代码_python作业:模拟计算器
- 在北京坐公交和大人流量地铁站换乘
- 斥资75元,我搭建了自己的博客网站
- 易信免费电话,确实业界良心
- java--表格的使用
- 极客学院mysql教程_干货分享 速成必备视频 六天带你玩转MySQL视频教程 数据库......
- MATLAB的强化学习工具箱(Reinforcement Learning Toolbox)使用细节注意
- 中国电信2019笔试题——求前后重叠的最长子字符串长度,基于java语言
- 关于智能产品设计的建议
- 使用canvas在一张图片上动态显示文字信息,并支持图片下载。
- excel表里分隔符替换为制表符的操作方法
热门文章
- 纵览数据库顶会VLDB 2019论文,我们发现了六大发展动向
- 存量电力系统_电力“十三五”:调整存量做优增量
- 龙尚海外市场又一强大新品Cat.12模组E7912,支持CBRS的无线网络频段
- 视频教程-ZStack 带你0基础搭建私有云平台|ZCCT实战培训视频|-云平台
- css圣杯模式的HTML代码,css圣杯布局是什么?
- 2019年猪年海报PSD模板-第七部分
- [附源码]JAVA+ssm计算机毕业设计超市销售管理系统(程序+Lw)
- linux使用docker制作PHP镜像及扩展Dockerfile
- 机器学习分类算法(二)-KNN(近邻)算法
- [PHB]FDN开启后手机仍然能够上网 - MTK物联网在线解答 - 技术论坛