2022/10/2 --- PWM A7核复习

创作本文目的:记录自己的学习历程


一、A7实现PWM器件启动的步骤

1.相关概念

1.PWM:脉冲宽度调制定时器
2.脉冲:方波信号,高低电平的变化产生方波信号
3.周期:高低电平变化所需要的时间,单位:ms
4.频率:周期和频率之间是倒数关系,1S钟可以产生的多少个方波信号,单位:HZ
5.占空比:高电平占整个周期的百分比
6.本次实验中:PWM/风扇/马达

2.分析硬件

在这里插入图片描述

蜂鸣器:TIM4_CH1----> PB6 gpio toggle gpiob6
风扇:TIM1_CH1----> PE9 gpiotoggle gpioe9
马达:TIM16_CH1----> PF6 gpio toggle gpiof6

3.分析芯片手册

分析RCC章节:相关控制器组使能
分析GPIO章节:复用模式/复用功能
分析TIM章节:产生特定的方波

3.1 RCC时钟使能

GPIOB组和TIM4组时钟使能---蜂鸣器
GPIOF组和TIM16组时钟使能---马达
GPIOE组,TIM1组时钟使能---风扇

3.2 GPIO复用功能

MODER寄存器
AFRL/AFRH寄存器

3.3 TIM*产生方波

BDTR(风扇和马达需要)
CCR1 --- 影响PWM方波占空比
ARR --- 影响PWM方波的周期和频率
PSC --- 设置预分频器
CCER --- 设置输出PWM方波的极性
CCMR1 --- 设置指定通道为PWM1模式 和 输出捕获预加载使能
CR1 --- 配置tim计数器方式(自动重载计数器预加载使能,设置边沿对齐模式,设置递减计数器,设置计数器使能)

4.PWM方波的产生

1.当定时器启动之后,自动重载计数器中的值,会自动加载到递减计数器中
2.递减计数器在CK_CNT时钟驱动下进行工作
3.每来一个时钟周期,递减计数器中的值减1
4.如果减到和比较/捕获寄存器中的值相等之后,电平发生翻转,这样就可产生PWM方波信号

5.部分程序

#include "beep.h"

void my_fan_tim1_init()
{
	// 1. 设置GPIOE,TIM1的时钟使能   RCC_MP_AHB4ENSETR  RCC_MP_APB2ENSETR
	RCC->MP_AHB4ENSETR |= (0x1 << 4);
	RCC->MP_APB2ENSETR |= (0x1 << 0);
	// 2. 设置PE9引脚为复用功能       GPIOE_MODER
	GPIOE->MODER &= (~(0x3 << 18));
	GPIOE->MODER |= (0x2 << 18);
	// 3. 设置PE9引脚为TIM1_CH1功能   GPIOE_AFRH
	GPIOE->AFRH &= (~(0xF << 4));
	GPIOE->AFRH |= (0x1 << 4);

	// 主输出使能
	TIM1->BDTR |= (0x1 << 15);
	// 4. 设置预分频寄存器,TIM1_PSC[15:0]  CK_PSC = 209MHz  
	// 		提供给TIM1的时钟源的频率是209MHz
	TIM1->PSC = 209 - 1;	
	// 5. 设置PWM方波的最终的周期  TIM1_ARR[16:0]
	// 		得到一个1000-2000Hz的方波
	TIM1->ARR = 10000;
	// 5. 设置PWM方波的占空比   TIM1_CCR1[16:0]
	TIM1->CCR1 = 5000;

	// 6. 设置TIM1_CH1通道为PWM1模式  
	// 		TIM1_CCMR1[16]  TIM1_CCMR1[6:4]  pwm模式1  = 0b0110
	TIM1->CCMR1 &= (~(0x1 << 16));
	TIM1->CCMR1 &= (~(0x7 << 4));
	TIM1->CCMR1 |= (0x6 << 4);
	TIM1->CCMR1 &= (~(0x3 << 0));
	
	// 7. 设置TIM1_CH1通道使能TIMx_CCR1预加载使能寄存器
	// 		TIM1_CCMR1[3] = 0x1
	TIM1->CCMR1 |= (0x1 << 3);
	// 8. 设置TIM1_CH1通道输出PWM方波的极性,
	// 	  TIM_CCER[3] = 0b0	TIM1_CCER[1] = 0x1 or 0x0
	TIM1->CCER &= (~(0x1 << 3));
	//TIM1->CCER |= (0x1 << 1);
	TIM1->CCER &= ~(0x1 << 1);
	// 9. 设置TIM1_CH1通道的输出使能位,输出PWM方波 
	// 		TIM1_CCER[0] = 0x1 
	TIM1->CCER |= (0x1 << 0);
	
	// 10. 设置TIM1_CH1通道的预装载寄存器的缓冲区的使能
	// 		TIM1_CR1[7] = 0x1 
	TIM1->CR1 |= (0x1 << 7);
	// 11. 设置定时器的计数方式,边沿对齐
	// 		TIM1_CR1[6:5] = 0x0
	TIM1->CR1 &= (~(0x3 << 5));
	// 12 设置定时器计数的方向,采用递减计数/递增计数 
 	//TIM1_CR1 &= (~(0x1 << 4)); 
	TIM1->CR1 |= (0x1 << 4);
	// 13. 使能TIM1_CH1计数器 
	// 		TIM1_CR1[0] = 0x1
	TIM1->CR1 |= (0x1 << 0);
}

void my_motor_tim16_init()
{
	// 1. 设置GPIOF,TIM16的时钟使能   RCC_MP_AHB4ENSETR  RCC_MP_APB2ENSETR
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	RCC->MP_APB2ENSETR |= (0x1 << 3);
	// 2. 设置PF6引脚为复用功能       GPIOF_MODER
	GPIOF->MODER &= (~(0x3 << 12));
	GPIOF->MODER |= (0x2 << 12);
	// 3. 设置PF6引脚为TIM16_CH1功能   GPIOF_AFRL
	GPIOF->AFRL &= (~(0xF << 24));
	GPIOF->AFRL |= (0x1 << 24);

	// . 主输出使能
	TIM16->BDTR |= (0x1 << 15);
	// 4. 设置预分频寄存器,TIM16_PSC[15:0]  CK_PSC = 209MHz  
	// 		提供给TIM16的时钟源的频率是209MHz
	TIM16->PSC = 209 - 1;	
	// 5. 设置PWM方波的最终的周期  TIM16_ARR[16:0]
	// 		得到一个1000-2000Hz的方波
	TIM16->ARR = 1000;
	// 5. 设置PWM方波的占空比   TIM16_CCR1[16:0]
	TIM16->CCR1 = 300;

	// 6. 设置TIM16_CH1通道为PWM1模式  
	// 		TIM16_CCMR1[16]  TIM16_CCMR1[6:4]  pwm模式1  = 0b0110
	TIM16->CCMR1 &= (~(0x1 << 16));
	TIM16->CCMR1 &= (~(0x7 << 4));
	TIM16->CCMR1 |= (0x6 << 4);
	TIM16->CCMR1 &= (~(0x3 << 0));

	// 7. 设置TIM16_CH1通道使能TIMx_CCR1预加载使能寄存器
	// 		TIM16_CCMR1[3] = 0x1
	TIM16->CCMR1 |= (0x1 << 3);
	// 8. 设置TIM16_CH1通道输出PWM方波的极性,
	// 	  TIM_CCER[3] = 0b0	TIM16_CCER[1] = 0x1 or 0x0
	TIM16->CCER &= (~(0x1 << 3));
	//TIM16->CCER |= (0x1 << 1);
	TIM16->CCER &= ~(0x1 << 1);
	// 9. 设置TIM16_CH1通道的输出使能位,输出PWM方波 
	// 		TIM4_CCER[0] = 0x1 
	TIM16->CCER |= (0x1 << 0);
	
	// 10. 设置TIM16_CH1通道的预装载寄存器的缓冲区的使能
	// 		TIM16_CR1[7] = 0x1 
	TIM16->CR1 |= (0x1 << 7);

	// 13. 使能TIM16_CH1计数器 
	// 		TIM16_CR1[0] = 0x1
	TIM16->CR1 |= (0x1 << 0);
}

void my_beep_tim4_init()
{
	//RCC
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	RCC->MP_APB1ENSETR |= (0x1 << 2);

	//GPIO
	GPIOB->MODER &= (~(0x3 << 12));
	GPIOB->MODER |= (0x1 << 13);
	GPIOB->AFRL &= (~(0xf <<24));
	GPIOB->AFRL |= (0x1 << 25);

	//TIM
	//TIM4_CR1
	TIM4->CR1 &= (~(0xf << 4));
	TIM4->CR1 |= (0x9 << 4);
	TIM4->CR1 |= 0x1;
	
	//TIM4_CCMR1
	TIM4->CCMR1 &= (~(0x1 << 16));
	TIM4->CCMR1 &= (~(0x7 << 4));
	TIM4->CCMR1 |= (0x3 << 3);
	TIM4->CCMR1 |= (0x1 << 3);
	TIM4->CCMR1 &= (~(0x3 << 0));
	
	//TIM4_CCER
	TIM4->CCER |= (0x1 << 3);
	TIM4->CCER &= (~(0x3 << 0));
	TIM4->CCER |= (0x1 << 0);
	
	//TIM4_PSC
	TIM4->PSC &= (~(0x0 << 15));
	TIM4->PSC |= 0xD0;
	
	//TIM4_ARR
	TIM4->ARR &= (~(0x0 << 31));
	TIM4->ARR |= 0x3E8;

	//TIM4_CCR1
	TIM4->CCR1 &=(~(0x0 << 31));
	TIM4->CCR1 |= 0x12C;
}

在主函数调用即可

6.效果

在这里插入图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你好!我可以理解你想要了解有关PWM-ON-PWM调制技术的问题。PWM-ON-PWM调制技术是一种用于控制电机转速的技术,通常应用于机器人控制和工业自动化领域。 PWM-ON-PWM调制技术的原理是通过将一个PWM信号嵌入到另一个PWM信号的占空比上,从而控制电机的转速。具体来说,PWM-ON-PWM调制技术需要两个PWM信号,一个称为“载波信号”,另一个称为“调制信号”。载波信号的频率通常较高,通常为10 kHz到20 kHz之间。调制信号的频率则较低,通常在几百Hz左右。通过将调制信号的占空比嵌入到载波信号的占空比上,可以控制电机的转速。 如果需要进一步了解PWM-ON-PWM调制技术的原理和应用,我建议你可以查阅一些相关的资料或教程。希望我的回答能够帮助到你! ### 回答2: PWM-ON-PWM调制模式是一种特殊的调制技术,主要用于控制和调节电子设备中的电压和电流。PWM代表脉宽调制,是一种通过对电压或电流的占空比进行调节来实现信号传输的方法。 PWM-ON-PWM调制模式则是在PWM调制的基础上进一步优化和改进的一种技术。它通过叠加两个或多个PWM信号来实现更高级的控制和调节效果。 在PWM-ON-PWM调制模式中,每个PWM信号都有自己的频率和占空比。这些PWM信号按照一定的顺序和时序进行叠加,形成一个更复杂的信号波形。通过调整各个PWM信号的频率和占空比,可以实现更精确的电压和电流调节,以满足不同应用场景的需求。 PWM-ON-PWM调制模式具有很高的灵活性和可调节性。它可以应用于许多领域,如电力电子、通信、无线电等。在电力电子领域,PWM-ON-PWM调制模式可以用于高效率的能量转换和传输,实现能源的有效利用。在通信和无线电领域,它可以用于数据传输、调频和数模转换等应用。 总之,PWM-ON-PWM调制模式是一种高级的调制技术,通过叠加多个PWM信号来实现更复杂和精确的电压和电流调节。它的应用范围广泛,可以满足各种电子设备的控制需求。 ### 回答3: PWM-ON-PWM调制模式是一种常用的电力电子调制技术。PWM代表脉宽调制(Pulse Width Modulation),是一种通过控制信号的脉冲宽度来调节信号的平均功率的方法。 在PWM-ON-PWM调制模式中,使用两个PWM信号进行调制。第一个PWM信号被称为载波信号,具有固定的频率和幅度。第二个PWM信号被称为调制信号,用来调节载波信号的占空比。 具体来说,调制信号的脉冲宽度和载波信号的周期相比较短,通常是载波信号周期的几分之一。调制信号的脉宽决定了输出信号的功率级别,通过改变调制信号的脉宽可以改变输出信号的平均功率。 PWM-ON-PWM调制模式的优点是可以灵活地控制输出信号的功率级别,可以适应不同的功率需求。它还具有较高的调制精度和线性性能,能够提供较高的输出电压和电流质量。此外,这种调制模式在许多领域中都有广泛的应用,如电力电子变频器、电力传输和电力调节等。 总之,PWM-ON-PWM调制模式是一种经典的电力电子调制技术,通过控制信号的脉冲宽度来调节信号的平均功率。它具有灵活的功率调节能力和较高的调制精度,在不同的应用中发挥着重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值