完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
PWM简介
脉冲宽度调制( PWM),是英文 Pulse Width Modulation 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 。简单一点,就是对脉冲宽度的控制。 我们要利用TIM3 的 CH2 输出 PWM 来控制 DS0 的亮度,要使用TIM3,我们必须先开启 TIM3 的时钟,这点相信大家看了这么多代码,应该明白了。这里我们还要配置 P B5 为复用输出,这是因为 TIM3_CH2 通道 将重映射到 PB5 上,此时, PB5属于复用功能输出 。 输出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 模块主要特点有:
首先,需要先用软件生成一个2KHz的正弦波 这里使用的是Adobe Audition CS6这个软件。 点击新建一个文件 设置相关参数 点击“效果”,“生成基本音色” 设置频率为2KHz 生成波形为2KHz正弦波 导出为wav文件 利用程序将WAV文件生成.c文件 点击打开文件并选择所需要转换的文件 左边的参数就会自动生成,点击生成代码并保存代码 生成代码如下图所示 将生成的C语言代码放到程序当中去 即可生成正弦波,以下是用示波器观察结果。 输出DAC音频 输出音频的步骤与输出正弦波的步骤是类似的,所以这里不再重复过多步骤。 给出以下不同的部分。 生成音频wav文件 生成WAV文件后转换成.c文件 输出波形 总结 PWM波形的输出是利用定时器3来控制输出的,输出引脚为PB5。需要观察PWM波形的时候,需要根据相关规则配置PB5来观察波形。在用示波器观察波形的时候,需要一个引脚连接PB5,一个引脚接地,这样的波形会更加平稳。 DAC输出波形的引脚为PA4。DAC简单来说就是将数字输出转换成模拟输出。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
652浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
520浏览 3评论
539浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
508浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 05:14 , Processed in 0.633584 second(s), Total 45, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号