完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、PWM简介 PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。其实我们也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM 进行编码。 PWM模式根据计数器CNT计数方式,可分为边沿对齐模式和中心对齐模式。这些在野火资料里都有,不做介绍了。 二、实验步骤 1.示例 本文使用的是野火STM32F103-mini开发板资料1-程序源码_教程文档1《STM32库开发实战指南》(标准库源码)【优先学习】1-书籍配套例程-F103RCMINI32-TIM—高级定时器3-TIM—高级定时器-PWM输入捕获里面的代码。 主要代码为: /* ---------------- PWM信号 周期和占空比的计算--------------- */ // ARR :自动重装载寄存器的值 // CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1) // PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M // 占空比P=CCR/(ARR+1) /** * @brief 通用定时器PWM输出初始化 * @param 无 * @retval 无 * @note */ static void ADVANCE_TIM_Mode_Config(void) { // 开启定时器时钟,即内部时钟CK_INT=72M ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE); /*--------------------时基结构体初始化-------------------------*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断 TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD; // 驱动CNT计数器的时钟 = Fck_int/(psc+1) TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_PSC; // 时钟分频因子 ,配置死区时间时需要用到 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 计数器计数模式,设置为向上计数 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 重复计数器的值,没用到不用管 TIM_TimeBaseStructure.TIM_RepetitionCounter=0; // 初始化定时器 TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure); /*--------------------输入捕获结构体初始化-------------------*/ // 使用PWM输入模式时,需要占用两个捕获寄存器,一个测周期,另外一个测占空比 TIM_ICInitTypeDef TIM_ICInitStructure; // 捕获通道IC1配置 // 选择捕获通道 TIM_ICInitStructure.TIM_Channel = ADVANCE_TIM_IC1PWM_CHANNEL; // 设置捕获的边沿 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 设置捕获通道的信号来自于哪个输入通道,有直连和非直连两种 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 1分频,即捕获信号的每个有效边沿都捕获 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 不滤波 TIM_ICInitStructure.TIM_ICFilter = 0x0; // 初始化PWM输入模式 TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure); // 当工作做PWM输入模式时,只需要设置触发信号的那一路即可(用于测量周期) // 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置 // 捕获通道IC2配置 // TIM_ICInitStructure.TIM_Channel = ADVANCE_TIM_IC1PWM_CHANNEL; // TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; // TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI; // TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // TIM_ICInitStructure.TIM_ICFilter = 0x0; // TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure); // 选择输入捕获的触发信号 TIM_SelectInputTrigger(ADVANCE_TIM, TIM_TS_TI1FP1); // 选择从模式: 复位模式 // PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT会被复位 TIM_SelectSlaveMode(ADVANCE_TIM, TIM_SlaveMode_Reset); TIM_SelectMasterSlaveMode(ADVANCE_TIM,TIM_MasterSlaveMode_Enable); // 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个) TIM_ITConfig(ADVANCE_TIM, TIM_IT_CC1, ENABLE); // 清除中断标志位 TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1); // 使能高级控制定时器,计数器开始计数 TIM_Cmd(ADVANCE_TIM, ENABLE); } 2.keil仿真 设置keil。 注意:Dialog DLL和Parameter里面的内容要和图片里的一致 打开调试。 选择逻辑分析器。 添加观察口,根据自己代码添加(PARTA或者其它)。 开始,在一段时间后停止。 结果如下: 3.示波器显示 示波器的夹子GND,笔接PA9或者PA10。 效果为: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1754 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1613 浏览 1 评论
1053 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1667 浏览 2 评论
1931浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
716浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
562浏览 3评论
587浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
546浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 15:45 , Processed in 0.681627 second(s), Total 73, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号