PWM定时器产生周期方波驱动蜂鸣器(S3C2440裸机开发)


前言

本期和大家来分享一下S3C2440平台下PWM的使用原理,以及PWM控制板子蜂鸣器的具体过程;建立一个从认识PWM信号到对PWM信号使用的全过程,希望各位小伙伴们加油哦!


一、PWM(脉宽调制)

1、PWM一般指脉冲宽度调制。
2、PWM是Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。
3、它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式。
4、其应用领域包括测量,通信,功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。

在单片机中,pwm是脉宽调制器,制作频率和占空比均可调整的脉冲信号,通过指定引脚输出
时间:依赖脉冲信号,一个周期的时间 高低变化信号的时间

pwm电路工作原理:
电路按照固定频率对一个数值进行减法操作,并且控制引脚输出,当被减值和预设比较值相等时,引脚输出反转,继续减法操作,直到减为0

二、通过PWM控制蜂鸣器(PWM定时器操作产生脉冲信号)

1.蜂鸣器电路及引脚

以下是S3C2440蜂鸣器的原理图,可见蜂鸣器由GPB0来进行控制,因此GPB0口需要输出一个PWM波来实现对蜂鸣器的控制;
在这里插入图片描述
接下来看一下GPB0对应的主控芯片的引脚功能,这里GPB0表示此引脚具有输入输出引脚的基本特性,TOUT0表示此引脚可以通过定时器来输出PWM信号:
在这里插入图片描述

2.流程

(1)设置GPB0为PWM功能也就是(TOUT0);如下图所示:
在这里插入图片描述
(2)固定的频率:电路要以一个固定的频率对其进行减法操作;
定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值}
TCFG0 一级分频值(预分频值)
TCFG1 二级分频值(分频值)
在这里插入图片描述
在这里插入图片描述

(3). 被减值和比较值
TCNTB0 被减值初值 确定频率
TCMPB0 比较值 确定占空比
在这里插入图片描述
TCNTO0 减法计数器的当前数值
在这里插入图片描述
(4) 引脚输出信号,TCON 第2位(控制变相器)
电路使能
TCON 第0位 使能
第1位 手动更新(实时更新TCNTB0,TCMPB0到减法计数器,只需要更新一次)
第3位 自动更新(减为0时TCNTB0,TCMPB0到减法计数器)
在这里插入图片描述
在这里插入图片描述

3.代码实现

接下里看一下通过定时器功能来实现引脚输出一个占空比为50%的波;这里需要注意的是如果是设置PWM输出模式,那么这里必须给TCMPB0 进行赋值,只有当单纯的使用PWM定时器的功能时是不需要给TCMPB0 进行赋值操作的;但是不论是哪一种情况,这里都需要将初始值手动更新给减法计数器,最后再启动自动重载功能,就不需要每次当TCNTB0 在减法计数器中减为零时进行手动更新的操作了;

代码如下(示例):

void pwm_init()
{
	GPBCON &= ~0x3;
	GPBCON |= 0x2;				//设置GPB0为pwm功能
	
	//目标  1k  占空比50%
	TCFG0 &= ~0xff;
	TCFG0 |= 24;
	TCFG1 &= ~0xf;			   //减法计数器频率=50M/(24+1)/2=1M
	TCNTB0 = 1000;  		   //被减值初值,确定频率(频率=1M/TCNTB0 = 1KHz)
	TCMPB0 = TCNTB0>>1;		   //向右平移一位表示将TCNTB0的值变为原来的一半
	TCON |= 1<<1; 			   //手动更新TCNTB0和TCMPB0到减法计数器
	TCON &= ~0xf;
	TCON |= 1<<3;  			   //开启启动更新
}

void pwm_start()
{
	TCON |= 1; //开始定时器
}

那么这里的现象也是非常简单的,实现的是蜂鸣器响的这么一个操作;


总结

本期主要分享的使用PWM定时器输出周期方波以此来驱动板载的蜂鸣器,主要具体介绍了输出PWM方波的整个详细流程,希望各位小伙伴们能够认真掌握这个流程,必要的时候可以用示波器对信号进行捕捉,来验证自己设置的信号究竟是否正确;最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您好!要使用STM32定时器输出PWM波来驱动无源蜂鸣器,可以按照以下步骤进行操作: 1. 配置定时器:选择一个合适的定时器和通道,将定时器配置为PWM输出模式。 2. 初始化定时器:设置定时器的预分频值和重载值,以确定PWM波的频率和占空比。 3. 配置GPIO:将蜂鸣器连接到相应的GPIO引脚上。 4. 启动定时器:使能定时器开始产生PWM波。 下面是一个简单的示例代码,用于在STM32上配置定时器2通道1输出PWM波来驱动无源蜂鸣器: ```c #include "stm32f4xx.h" void TIM2_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能定时器2和GPIOA的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置GPIO引脚为复用功能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置GPIO引脚与定时器2通道1的映射关系 GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2); // 配置定时器2的基本参数 TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 设置重载值,决定PWM波的频率 TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1; // 设置预分频值,决定定时器的时钟频率 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 配置定时器2通道1为PWM输出模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 设置脉冲宽度,决定PWM波的占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 启动定时器2 TIM_Cmd(TIM2, ENABLE); } ``` 以上代码假设您的无源蜂鸣器连接到了STM32的PA0引脚上,使用的是STM32F4系列芯片。您可以根据实际情况进行相应的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值