目录
位置式(概念理解使用的是位置式,但是实际操作使用的一般是增量式)
简述:
用来输出PWM波形
输出比较 OC:
输出比较可以通过比较CNT和CCR寄存器值的关系,来对输出电平进行置1、置零或者翻转工作,用于输出具有一定频率和占空比的波形。
脉冲宽度调制PWM
逻辑关系
频率 = 占空比=
分辨率=占空比的变化步距
分辨率也可以理解为占空比变化的细腻程度。
32里面的计算公式
PSC预分频器的值、ARR自动重装器的值
1、频率 :
Freq = ck_PSC /(PSC + 1)/(ARR + 1);
ck_PSC 晶振频率,c8t6在这时72M
定时器的溢出频率等同于更新频率。
2、占空比:
Duty = CCR /(ARR + 1 );
3、分辨率:
Reso = 1/(ARR + 1);
每次调制PWM的时候都应该详细的知道自己需要的是多少频率,占空比是多少,分辨率是百分之几的占空比,然后根据自己的需求设置相应的参数。
!!!CCR 的取值在 0~(ARR+1) 这个区间内
每个高级定时器和普通定时器都拥有4个输出比较通道。
高级定时器的3个通道额外拥有死区生成和互补输出 的功能。
在具有惯性的系统中,才能进行脉宽调制。灯可以利用视觉暂存和余辉效应,使得灯不是马上熄灭的;电机也不是马上停止的。
通用定时器
解读
CNT和CCR1第一路的捕获/比较寄存器,二者进行比较,然后输出高低电平。
兵分两路,一个是映射到主模式的TRGO输出上;
一个是极性选择,给寄存器写0,信号就会往上走,信号电平不翻转;写1的话信号通过非门取反,发生信号翻转。
接下来就是使能,OC1就是输出比较。
REF信号就是指参考信号,在这是指OC1ref的高低电平;ETRF输入是指定时器一个不常用的小功能
输出比较的模式
PWM2是PWM1模式的取反
对于普通的引脚输出,引脚的控制权是来自于输出数据寄存器;
但定时器控制引脚,需要使用复用开漏,推挽输出模式,控制权交给片上外设。
TIM_setCompare1是设置CCR寄存器的值,并不是直接是占空比,占空比是CCR和(ARR+1)共同决定的。
补充定时器的概念
定时器是一种用于测量时间间隔的硬件设备,在计算机中常用于生成周期性的定时中断,用于控制信号的频率。定时器产生的定时中断可以在中断处理函数中修改控制信号的状态,从而实现对控制信号的周期性控制。但如果控制信号的周期由其他硬件设备产生,如外部信号源,则定时器并不决定控制信号的频率。
直流电机属于大功率器件,GPIO无法直接驱动。
重映射-引脚复用
STM32重映射,实现引脚复用,配置重映射,需要在在AFIO上实现。
1、初始化AFIO
开启时钟,AFIO是APB2的设备。
GPIO_PinRemapConfig引脚重映射配置
手册查看AFIO,看引脚重映射功能。
2、对于上电后默认为调试器端口是JTDI的GPIO口,若想使其作为普通的GPIO口或者复用定时器的通道,要先关闭调试端口的复用。使用的是GPIO_PinRemapConfig函数
SWJ------>SWD和JTAG两种调试方法。
GPIO_Remap_SWJ_Disable会导致把SWD和JTAG的调试端口全部解除,如果调用调试端口就没了,在此之后不能再使用STLINK下载程序进去吧咯。
此时只能使用串口下载,下载一个新的没有解除调试端口的程序进去。
在STM32中,JTAG和SWD都是用于调试和编程的接口。它们之间的差异主要在于:
JTAG是一种标准接口,可以连接多个设备,包括调试器,芯片,和其他外设。而SWD是一种单线调试接口,只能连接一个设备。这也导致了在多设备调试和编程时,SWD的灵活性不如JTAG。
JTAG具有4根引脚(TMS,TCK,TDI和TDO),而SWD只使用2根引脚(SWDIO和SWCLK)。因此,SWD可以占用更少的引脚,为系统设计提供更大的灵活性。
在某些情况下,SWD可以更快地执行调试和编程操作,因为它使用了更少的引脚和更少的时钟周期。
在使用哪种接口时,需要根据具体的应用场景和需求进行选择。如果需要同时调试多个设备,或者需要更高的灵活性,则应该使用JTAG。如果资源有限或需要更快的操作速度,则应该使用SWD。
JTDI是STM32微控制器的调试端口,是一种专用于JTAG调试接口的端口。
JTAG是一种通过硬件接口进行微控制器调试和编程的标准。
JTDI端口用于连接JTAG调试接口和微控制器的调试电路,使得开发人员可以通过调试器对STM32微控制器进行调试、单步执行和程序下载等操作。JTDI端口通常与JTDO(JTAG数据输出)、JTCK(JTAG时钟)和NRST(复位引脚)一起使用,形成完整的JTAG调试接口。在STM32微控制器中,JTDI端口一般位于调试端口的第二个引脚,即SWDIO(Serial Wire Debug Data Input/Output)引脚旁边。
总结来说,要需要PA15、PB3、PB4这三个引脚作为GPIO来使用,要打开AFIO时钟,然后用AFIO将JTAG复用解除掉。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //解除PA15的JTAD
如果需要重映射定时器或者其他外设的复用引脚,则要
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE); //引脚重映射,PA0->PA15
如果即使定时器或者其他外设的复用引脚,也是调试端口则需要三局组合使用。
记得在端口挪用之后,修改GPIO的初始化!!!!
对于同一个定时器的不同通道输出不同的PWM
对于同一个定时器的不同通道输出不同的PWM,由于共用一个计数器,所以频率、相位是一样的,占空比由各自的CCR决定。
PID算法
为了实现PID需要什么东西呢?
一个测量装置
由于我们需要对(实际速度-期望速度的差值)error来进行操作,我们就得知道实际速度和期望速度所以我们就需要一个测速装置。
这次用编码器。这就叫速度环(也叫速度闭环)。
同样的,如果想做一个角度环(让实际角度=期望角度)-------那就加一个测角度的传感器―陀螺仪(MPU6050,很常用)
编码器电机
电机线可以选择不接
32使用编码器的话有一个成熟的库,正交解码
编码电机的a、b相可以以用来测量电机的速度,两者组合在一起使用还可以用来测量电机正反转。
设置计数器的重装值,已知电机是多少线的
TIMx_ARR = 1024 *4 - 1 =4095
如果是360线的就是 TIMx_ARR = 360 *4 - 1 = 1439
不是很精确的话可以直接设置成65535
PID公式
一般有两种,一个是位置式,一个是增量式。
位置式(概念理解使用的是位置式,但是实际操作使用的一般是增量式)
比例✖当前值+积分✖累计值+微分✖差值
P:比例项,最重要的部分; I:积分项,减小静差; D:微分项,增加阻尼。
Kp比较重要,有时候可以采取纯P控制
放在车子上面就是,如果Kp较小,调节的时间就会长。而我们并不想时间那么长,于是开始调节使得Kp增大,但是Kp增大到超越一定的数值,就会产生抖K
Ki呢就好比用来加上木桶的漏水量,把水灌满。
因为只有KP的话,是无限接近预期值,但会一直达不到预期值。而加上Ki,则有可能使得达到预期值。
Kd就是不让水灌得太快。这次得误差值*上次的误差值一般是负值,可以防止速度太快,在小车上可以防止参数过大导致电机被烧坏。