PWM简介
脉冲宽度调制( PWM),是英文 Pulse Width Modulation 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 。简单一点,就是对脉冲宽度的控制。
我们要利用TIM3 的 CH2 输出 PWM 来控制 DS0 的亮度,要使用TIM3,我们必须先开启 TIM3 的时钟,这点相信大家看了这么多代码,应该明白了。这里我们还要配置 P B5 为复用输出,这是因为 TIM3_CH2 通道 将重映射到 PB5 上,此时, PB5属于复用功能输出 。
输出PWM波形
- 芯片:STM32F103ZET6
- 环境:Keil5
- 例程:正点原子官方例程
烧录 PWM 例程
主要函数:
Tips:这里给出的是定时器3(即Time3)的函数。
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
LED1=!LED1;
}
}
定时器的函数中包含了定时器初始化的函数,以及定时器中断服务函数。
- 显而易见,定时器初始化函数就是实现了定时器的初始化工作;
- 中断服务函数里面就实现了开启定时中断后需要执行的任务。
以上函数都是正点原子官方库给出的定时器的例程,此函数一般在例程中会有,所以不会自己编写。
主函数:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}
主函数里的内容主要编写的是变化输出的PWM波形。利用延时函数实现波形的变化。
函数分析:
延时10毫秒之后,对变量进行加一操作,直到变量值达到300之后,再将变量值置为0,重新开始计数。这样就可以实现输出的PWM波形占空比的变化。
在Keil中查看PWM波形
在小魔术棒中进行如下配置
点击调试
点击设置
进行如下设置
注意:不同的板子输出PWM波形的引脚可能不一样,这里的配置也会不一样。
配置完成之后,可以观察到波形。
示波器中观察波形
OK!完成PWM波形的输出。
DAC简介
STM32的 DAC 模块 数字 模拟转换模块 是 12 位数字输入,电压输出型的 DAC。
STM32的 DAC 模块主要特点有:
- 2 个 DAC 转换器:每个转换器对应 1 个输出通道
- 8 位或者 12 位单调输出
- 12 位模式下数据左对齐或者右对齐
- 同步更新功能
- 噪声波形生成
- 三角波形生成
- 双 DAC 通道同时或者分别转换
- 每个通道都有 DMA 功能
设置 DAC 模块的通道 1 来输出模拟电压,其详细设置步骤如下:
- 开启 PA 口时钟,设置 PA4 为模拟输入。
- 使能 DAC1时钟。
- 初始化 DAC, 设置 DAC 的工作模式。
- 使能 DAC 转换通道。
- 设置 DAC 的输出值。
输出DAC波形
- 芯片:STM32F103ZET6
- 环境:Keil5
- 例程:正点原子官方例程
输出DAC正弦波
首先,需要先用软件生成一个2KHz的正弦波
这里使用的是Adobe Audition CS6这个软件。
点击新建一个文件
设置相关参数
点击“效果”,“生成基本音色”
设置频率为2KHz
生成波形为2KHz正弦波
导出为wav文件
利用程序将WAV文件生成.c文件
点击打开文件并选择所需要转换的文件
左边的参数就会自动生成,点击生成代码并保存代码
生成代码如下图所示
将生成的C语言代码放到程序当中去
即可生成正弦波,以下是用示波器观察结果。
输出DAC音频
输出音频的步骤与输出正弦波的步骤是类似的,所以这里不再重复过多步骤。
给出以下不同的部分。
生成音频wav文件
生成WAV文件后转换成.c文件
输出波形
总结
PWM波形的输出是利用定时器3来控制输出的,输出引脚为PB5。需要观察PWM波形的时候,需要根据相关规则配置PB5来观察波形。在用示波器观察波形的时候,需要一个引脚连接PB5,一个引脚接地,这样的波形会更加平稳。
DAC输出波形的引脚为PA4。DAC简单来说就是将数字输出转换成模拟输出。
PWM简介
脉冲宽度调制( PWM),是英文 Pulse Width Modulation 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 。简单一点,就是对脉冲宽度的控制。
我们要利用TIM3 的 CH2 输出 PWM 来控制 DS0 的亮度,要使用TIM3,我们必须先开启 TIM3 的时钟,这点相信大家看了这么多代码,应该明白了。这里我们还要配置 P B5 为复用输出,这是因为 TIM3_CH2 通道 将重映射到 PB5 上,此时, PB5属于复用功能输出 。
输出PWM波形
- 芯片:STM32F103ZET6
- 环境:Keil5
- 例程:正点原子官方例程
烧录 PWM 例程
主要函数:
Tips:这里给出的是定时器3(即Time3)的函数。
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
LED1=!LED1;
}
}
定时器的函数中包含了定时器初始化的函数,以及定时器中断服务函数。
- 显而易见,定时器初始化函数就是实现了定时器的初始化工作;
- 中断服务函数里面就实现了开启定时中断后需要执行的任务。
以上函数都是正点原子官方库给出的定时器的例程,此函数一般在例程中会有,所以不会自己编写。
主函数:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}
主函数里的内容主要编写的是变化输出的PWM波形。利用延时函数实现波形的变化。
函数分析:
延时10毫秒之后,对变量进行加一操作,直到变量值达到300之后,再将变量值置为0,重新开始计数。这样就可以实现输出的PWM波形占空比的变化。
在Keil中查看PWM波形
在小魔术棒中进行如下配置
点击调试
点击设置
进行如下设置
注意:不同的板子输出PWM波形的引脚可能不一样,这里的配置也会不一样。
配置完成之后,可以观察到波形。
示波器中观察波形
OK!完成PWM波形的输出。
DAC简介
STM32的 DAC 模块 数字 模拟转换模块 是 12 位数字输入,电压输出型的 DAC。
STM32的 DAC 模块主要特点有:
- 2 个 DAC 转换器:每个转换器对应 1 个输出通道
- 8 位或者 12 位单调输出
- 12 位模式下数据左对齐或者右对齐
- 同步更新功能
- 噪声波形生成
- 三角波形生成
- 双 DAC 通道同时或者分别转换
- 每个通道都有 DMA 功能
设置 DAC 模块的通道 1 来输出模拟电压,其详细设置步骤如下:
- 开启 PA 口时钟,设置 PA4 为模拟输入。
- 使能 DAC1时钟。
- 初始化 DAC, 设置 DAC 的工作模式。
- 使能 DAC 转换通道。
- 设置 DAC 的输出值。
输出DAC波形
- 芯片:STM32F103ZET6
- 环境:Keil5
- 例程:正点原子官方例程
输出DAC正弦波
首先,需要先用软件生成一个2KHz的正弦波
这里使用的是Adobe Audition CS6这个软件。
点击新建一个文件
设置相关参数
点击“效果”,“生成基本音色”
设置频率为2KHz
生成波形为2KHz正弦波
导出为wav文件
利用程序将WAV文件生成.c文件
点击打开文件并选择所需要转换的文件
左边的参数就会自动生成,点击生成代码并保存代码
生成代码如下图所示
将生成的C语言代码放到程序当中去
即可生成正弦波,以下是用示波器观察结果。
输出DAC音频
输出音频的步骤与输出正弦波的步骤是类似的,所以这里不再重复过多步骤。
给出以下不同的部分。
生成音频wav文件
生成WAV文件后转换成.c文件
输出波形
总结
PWM波形的输出是利用定时器3来控制输出的,输出引脚为PB5。需要观察PWM波形的时候,需要根据相关规则配置PB5来观察波形。在用示波器观察波形的时候,需要一个引脚连接PB5,一个引脚接地,这样的波形会更加平稳。
DAC输出波形的引脚为PA4。DAC简单来说就是将数字输出转换成模拟输出。
举报