2021-01-14

PWM简介
PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制。

用STM32F103输出一路PWM波形
采用定时器方法
1)使能定时器及端口时钟,并设置引脚复用器映射

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
1
2
3
4
2)初始化定时器参数,包含自动重装值,分频系数,计数方式等

void TIM_TimeBaseInit(TIM_TypeDefTIMx,TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct);
1
3)初始化PWM输出参数,包含PWM模式、输出极性,使能等

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
1
4)开启定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); TIM_Cmd(TIM3,ENABLE); //开启定时器
1
5)修改TIMx_CCRx的值控制占空比

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1);
1
6)使能TIMx在CCRx上的预装载寄存器 使能输出比较预装载库函数是:

void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
1
7)使能 TIMx 在 ARR 上的预装载寄存器允许位 使能 TIMx 在 ARR 上的预装载寄存器允许位库函数是:

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); //第一个参数用于选择定时器,第二个参数用于选择使能还是失能。
1
高级定时器要想输出PWM波形,必须要设置一个 MOE 位(TIMx_BDTR 的第 15 位),以使能主输出,否则不会输出 PWM。库函数设置的函数为:

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
1
pwm.h

#ifndef _pwm_H
#define _pwm_H

#include “system.h”

void TIM3_CH1_PWM_Init(u16 per,u16 psc);

#endif

PWM代码

pwm.c
1 #include “pwm.h”
2
3 /*******************************************************************************
4 * 函 数 名 : TIM3_CH1_PWM_Init
5 * 函数功能 : TIM3通道1 PWM初始化函数
6 * 输 入 : per:重装载值
7 psc:分频系数
8 * 输 出 : 无
9 ******************************************************************************/
10 void TIM3_CH1_PWM_Init(u16 per,u16 psc)
11 {
12 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
13 TIM_OCInitTypeDef TIM_OCInitStructure;
14 GPIO_InitTypeDef GPIO_InitStructure;
15
16 /
开启时钟 /
17 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
18 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
19 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能
20
21 /
配置GPIO的模式和IO口 */
22 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
23 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
24 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
25 GPIO_Init(GPIOC,&GPIO_InitStructure);
26
27 GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射
28
29 TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值
30 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
31 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
32 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
33 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
34
35 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
36 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
37 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
38 TIM_OC1Init(TIM3,&TIM_OCInitStructure); //输出比较通道1初始化
39
40 TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的预装载寄存器
41 TIM_ARRPreloadConfig(TIM3,ENABLE);//使能预装载寄存器
42
43 TIM_Cmd(TIM3,ENABLE); //使能定时器
44
45 }
main.c
1 #include “system.h”
2 #include “SysTick.h”
3 #include “led.h”
4 #include “pwm.h”
5
6 int main()
7 {
8 u16 i=0;
9 u8 fx=0;
10 SysTick_Init(72);
11 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
12 LED_Init();
13 TIM3_CH1_PWM_Init(500,72-1); //频率是2Kh
14
15 while(1)
16 {
17
18 if(fx0)
19 {
20 i++;
21 if(i
300)
22 {
23 fx=1;
24 }
25 }
26 else
27 {
28 i–;
29 if(i==0)
30 {
31 fx=0;
32 }
33 }
34 TIM_SetCompare1(TIM3,i); //i值最大可以取499,因为ARR最大值是499.
35 delay_ms(10);
36 }
37 }
keil仿真效果图
在这里插入图片描述
在keil中编译这个程序,通过之后将这个程序生成的hex文件烧录进核心板中,再将核心板与示波器连接,即可观察到波形

输出一个周期2khz的正弦波(循环)
上列手动写入函数比较麻烦,而且初学者,比如我,其实使不知道该把这些函数写在哪里的,可以说对初学者及其不友好。
下面使用stm32cubemx,直接图形化配置,最后至多加几行代码,即可完成实验,没有安装可自行百度,比较简单
打开cubemx
在这里插入图片描述
在这里插入图片描述
通过蜂鸣器原理图,使用PA15的tim
在这里插入图片描述
在这里插入图片描述
到此芯片页面配置完毕,再配置configuration页面,时钟树页面(clock configuration)可以用默认值
在这里插入图片描述
设置2khz的公式:2khz=时钟输入频率(默认8M)/(分频值7+1)/重载值(500),默认占空比50%(比较值500*50%=250)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所有配置完成,接下来生成keil工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后编译,烧录即可,其余的魔法棒设置在cubemx中已经自动设置好,不用手动设置,如果自己的调试设备有变手动改变设置即可
在这里插入图片描述
将一段数字音频歌曲数据转换为模拟音频波形输出(循环)
用Adobe Audition CS6打开一个音频文件,选择一段区域
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用UltraEdit打开刚才保存wav文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将选中内容复制金一个新文本中,再用notepad++打开这个文本‘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后编译,烧录进硬件中,就可以使用示波器观察了,这里因条件有限,就没有进行最后一步。
参考:https://blog.csdn.net/weixin_51087836/article/details/111871722
https://blog.csdn.net/qq_45237293/article/details/112006657

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值