当前位置:   article > 正文

STM32F103C8的IO口输入输出与PWM总结_stm32f1 io口输出pwm

stm32f1 io口输出pwm


前言

最近一周多的时间开始学习并自己动手制作了一个循迹小车,主要运用的就是tb6612芯片以及红外避障模块,这篇博客主要就是总结一下在制作小车过程中学习到的知识以及问题。


一、有关IO输出输入的总结

在这次小车制作中,我使用到的有tb6612电机驱动芯片和MH-Sensor-Series红外循迹避障模块,两者的使用方法都不是很复杂,只需要在对应的引脚上接高低电平或者接输入引脚即可,但正是这么基础的引脚操作中也发现了很多小细节,有同学在制作小车的过程中就遇到了写完代码根本没达到预期效果,后来才发现是一些引脚的模式或者使能问题,因此我也更详细学习了一下IO口的八种输入输出模式。

下面就是我个人对这几种模式的理解

一、输入模式

1.浮空输入(GPIO_Mode_IN_FLOATING)

该模式主要针对芯片本身,以及其他的逻辑器件(即由大量逻辑开关组成的元器件),在该模式下,引脚既不表现为高电平也不表现为低电平,如果用电压表测量测得的可能也有所不同。

浮空输入大多数情况就是代表该引脚什么都不接,但是在网上也有说可以用于ADC传输数据使用,但我并不了解。

这个模式基本用不上,如果以后我有使用会在这里记录。

2.上拉输入(GPIO_Mode_IPU)

在上拉输入模式下,引脚什么都不接的情况下表现为高电平,当连接到TTL(高电平低电平)信号时,会发生改变。

没有输入或者是输入为高电平时,其电压为高;输入为低电平时,电压为低。

这里要注意的是没有输入的时候就处于高电平,适用于那些平常状态输出高,特殊状态输出低的模块。

3.下拉输入(GPIO_Mode_IPD)

和上拉输入类似

在下拉输入模式下,引脚什么都不接的情况下表现为低电平,当连接到TTL(高电平低电平)信号时,会发生改变。

没有输入或者是输入为低电平时,其电压为低;输入为高电平时,电压为高。

这里要注意的是没有输入的时候就处于低电平,适用于那些平常状态输出低,特殊状态输出高的模块。

4.模拟输入(GPIO_Mode_AIN)

模拟输入不同于以上三种输入模式,前面三种模式都是数字信号的输入也就是非高即低的信号,而模拟输入就是输入未经处理的信号,可以是一段连续的电压不固定的信号

往往在数模转换中需要用到,比如读取某个引脚的电压值,这个电压值就可能是PWM波形,使用模拟输入就可以讲信号不经处理的传给ADC模块进行分析。

二、输出模式

1.开漏输出(GPIO_Mode_Out_OD)

在开漏模式下,控制IO输出低时IO口输出低,控制IO口输出高时IO口既不输出高也不输出低,电压不确定。(由外部驱动,降低芯片的驱动压力)

在使用该模式时,通常外接一个电阻,通过这个电阻来给予高电平。“推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合”

或者在推挽输出模式下我们输出的电平是3.3V,但是我们想要达到一个5V的输出,就可以采用开漏输出,通过外接一个上拉电阻来控制我们的电压能够达到5V。

再或者可以用一个IO口进行双向的数据传输。

首先从引脚往外这个指向来说,引脚输出低时IO为低,引脚输出高时外部可以由上拉电阻将IO上拉为高。

其次从外往引脚这个指向来说,由于IO的高低电平与外部上拉电阻有关,也就可以通过外部上拉电阻的有无来 反向控制IO的高低,之后可以运用寄存器读取IO状态从而获得外部的电平信号。这样就可以达到IO口的双向功能。(仅个人理解)

上拉电阻的阻值不仅影响输出的电平高低,还影响着信号的延迟,阻值越大信号也就越延迟但是功耗小。

2.推挽输出(GPIO_Mode_Out_PP)

引脚输出低时IO为低,引脚输出高时IO输出高。

3.推挽复用输出(GPIO_Mode_AF_PP)

可以使用IO口的第二功能,例如定时器、串口等。相当于是输出信号更多样的推挽输出。

输出PWM信号时需要使用该输出模式。

4.开漏复用输出(GPIO_Mode_AF_OD)

可以使用IO口的第二功能,例如定时器、串口等。相当于是输出信号更多样的开漏输出。


二、PWM输出的一些总结

1.引脚与定时器和通道的对应关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
STM32的定时器除了定时器6和定时器7都可以用来产生PWM,定时器1和定时器8是高级定时器,都可可以同时产生7路PWM,需要注意的是在配置高级定时器时需要多加这样的一行代码

TIM_CtrlPWMOutputs(TIM1,ENABLE);
  • 1

这一行代码可以追根源头发现是控制的是 刹车和死区寄存器(TIMx_BDTR)

2.一些结构体成员的介绍

①TIM_OCInitStructure.TIM_OCMode

该元素设置的是PWM的模式,可以指定两种模式

TIM_OCMode_PWM1

在向上计数时,一旦装载值小于占空比时通道为无效电平,否则为有效电平
在向下计数时,一旦装载值大于占空比时通道为有效电平,否则为无效电平。

TIM_OCMode_PWM2

向上计数时,一旦装载值小于占空比时通道1为有效电平,否则为无效电平
向下计数时,一旦转载值大于占空比时通道1为无效电平,否则为有效电平。

②PWM初始化函数的两个入口参数

TIM_TimeBaseStructure.TIM_Period

该元素设置的是计数值,通常是PWM初始化函数的第一个入口参数arr,这个值影响一次PWM周期的时间长短。

TIM_TimeBaseStructure.TIM_Prescaler

该元素设置的是预分频值,通常是PWM初始化函数的第二个入口参数psc,这个值也影响一次PWM周期的时间长短。

由公式

Fpwm = TCLK / ((arr+1)*(psc+1)) (单位:Hz)

可计算一次PWM的周期时长

其中TCLK的具体频率可以到时钟树中查找,不同定时器的最高频率是不同的
TIM1、TIM8、TIM15、TIM16、TIM17、TIM9、TIM10、TIM11属APB2总线,最高频率为72M
TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、TIM12、TIM13、TIM14属APB1总线,最高频率为36M
具体可以查数据手册

③TIM_TimeBaseStructure.TIM_CounterMode

该元素设置的是PWM的计数模式,常用的有以下两种。

TIM_CounterMode_Up

向上计数

TIM_CounterMode_Down

向下计数

还有几种不常用的
在这里插入图片描述

④TIM_OCInitStructure.TIM_OCPolarity

该元素设置输出极性,这个元素要配合PWM模式来说,在PWM模式中有无效电平和有效电平的区别,而具体的有效电平是什么呢?
就是在这个元素设置的,这里的元素如果设置成为TIM_OCPolarity_High则有效电平就是高电平,如果元素设置为TIM_OCPolarity_Low,则有效电平就是低电平。


总结

这篇博客主要介绍了一些输入输出函数的小细节,以及PWM的一些重要结构体元素代表什么。
输入输出与PWM可以说是STM32的基础操作,只有加强对基础的了解才可能在后面的学习中更加顺利。

写在最后


本人小白一枚,这些仅仅是我个人的经验与认知,也许含有多处错误,希望读者给我指正。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/147789
推荐阅读
相关标签
  

闽ICP备14008679号