stm32关于输出PWM_第1页
stm32关于输出PWM_第2页
stm32关于输出PWM_第3页
stm32关于输出PWM_第4页
stm32关于输出PWM_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STM32 定时器产生 PWM 我先用 STM32 的通用定时器用 PWM 模式产生四路相同占空比 不同频率的 PWM 波 配 置如下 RCC APB1PeriphClockCmd RCC APB1Periph TIM2 ENABLE 使能 TIM2 时钟 TIM InternalClockConfig TIM2 使用内部时钟 TIM BaseInitStructure TIM Prescaler 3 设置 TIM 时钟频率除数的预分频值 TIM BaseInitStructure TIM CounterMode TIM CounterMode Up 选择计数器模式 TIM BaseInitStructure TIM Period 1799 设置下一个更新事件装入活动的自动重装载寄 存器周期的值 TIM BaseInitStructure TIM ClockDivision 0 设置时钟分割 TIM TimeBaseInit TIM2 通道 1 TIM OCInitStructure TIM OCMode TIM OCMode PWM1 选择定时器模式 TIM OCInitStructure TIM OutputState TIM OutputState Enable 选择输出比较状态 TIM OCInitStructure TIM OutputNState TIM OutputNState Disable 选择互补输出比较 状态 TIM OCInitStructure TIM Pulse CCR1 Val 设置了待装入捕获比较器的脉冲值 TIM OCInitStructure TIM OCPolarity TIM OCPolarity High 设置输出极性 TIM OCInitStructure TIM OCNPolarity TIM OCNPolarity Low 设置互补输出极性 TIM OCInitStructure TIM OCIdleState TIM OCIdleState Set 选择空闲状态下得非工作 状态 TIM OCInitStructure TIM OCNIdleState TIM OCNIdleState Reset 选择互补空闲状态 下得非工作状态 TIM OC1Init TIM2 TIM OC1PreloadConfig TIM2 TIM OCPreload Enable 通道 2 TIM OCInitStructure TIM Pulse CCR2 Val 设置了待装入捕获比较器的脉冲值 TIM OC2Init TIM2 TIM OC2PreloadConfig TIM2 TIM OCPreload Enable 通道 3 TIM OCInitStructure TIM Pulse CCR3 Val 设置了待装入捕获比较器的脉冲值 TIM OC3Init TIM2 TIM OC3PreloadConfig TIM2 TIM OCPreload Enable 通道 4 TIM OCInitStructure TIM Pulse CCR4 Val 设置了待装入捕获比较器的脉冲值 TIM OC4Init TIM2 TIM OC4PreloadConfig TIM2 TIM OCPreload Enable TIM Cmd TIM2 ENABLE TIM CtrlPWMOutputs TIM2 ENABLE 用 pwm 模式输出的频率和占空比是固定的 不可调 要想输出频率可调 占空比可调 必 须得使用比较输出模式 这点资料是在 STM32 全国巡回研讨会上看到的 如图 所以 接下来我就写了一个程序通过输出比较模式产生一路 PWM 波 这个波的频率和占 空比都由自己确定 函数配置如下 TIM BaseInitStructure TIM Prescaler 3 设置 TIM 时钟频率除数的预分频值 18M TIM BaseInitStructure TIM CounterMode TIM CounterMode Up 选择计数器模式 TIM BaseInitStructure TIM Period 1800 设置下一个更新事件装入活动的自动重装载寄 存器周期的值 TIM BaseInitStructure TIM ClockDivision 0 设置时钟分割 TIM TimeBaseInit TIM2 通道 1 TIM OCInitStructure TIM OCMode TIM OCMode Toggle 选择定时器模式 TIM OCInitStructure TIM OutputState TIM OutputState Enable 选择输出比较状态 TIM OCInitStructure TIM OutputNState TIM OutputNState Disable 选择互补输出比较 状态 TIM OCInitStructure TIM Pulse CCR1 Val1 设置了待装入捕获比较器的脉冲值 TIM OCInitStructure TIM OCPolarity TIM OCPolarity High 设置输出极性 TIM OCInitStructure TIM OCNPolarity TIM OCNPolarity Low 设置互补输出极性 TIM OCInitStructure TIM OCIdleState TIM OCIdleState Set 选择空闲状态下得非工作 状态 TIM OCInitStructure TIM OCNIdleState TIM OCNIdleState Reset 选择互补空闲状态 下得非工作状态 TIM OC1Init TIM2 TIM OC1PreloadConfig TIM2 TIM OCPreload Disable TIM ARRPreloadConfig TIM2 ENABLE TIM ITConfig TIM2 TIM IT CC1 ENABLE TIM Cmd TIM2 ENABLE void TIM2 IRQHandler void TIM ClearITPendingBit TIM2 TIM IT CC1 if n 1 n 0 TIM SetCompare1 TIM2 CCR1 Val2 else n 1 TIM SetCompare1 TIM2 CCR1 Val1 通过改变比较寄存器 CCR1 中的值 改变 PWM 的占空比 在每次匹配中断中改变 CCR1 的值 上面程序实现的是产生一路频率为 10K 占空比为 40 的 PWM 波 有了上面的思想我就想产生四路不同频率不同占空比的 PWM 波 经过反复思考光配函数 似乎不能实现 在网上去查了的 很多网友也说不能实现 有一个网友给了一个提示 软 件模拟 刚开始没明白什么意思 于是还是自己继续配置库函数 在这个过程中一直有两 个疑问 每次中断中 CCR 寄存器的值都在循环的增加 CCR 的寄存器不可能是无限大吧 就算是 无限大 计数器也不是无限大呀 他只能记到 65535 初步确定使用匹配中断不行 我有 想过同时使用溢出中断和匹配中断 但这样四路 PWM 波只能是固定的 频率和占空比不 能调 大概说一下怎样用溢出中断和匹配中断实现四路固定的 PWM 波 把计数器寄存器 CNT 的值装最大周期的那个 PWM 波 当一次计数完成算一下三路小点周期数 在匹 配中断中对应的设个变量 CCR 就改变几次 溢出中断来了就再次给计数器装初值 同时 四个比较寄存器从装初值 这样很麻烦 理论上可以实现 但我考虑到最终不能实现我的 要求 就没有去验证 所以产生四路频率可调占空比可调 用一个定时器似乎不能实现 就一直卡到这里 我又在想飞哥说能实现 就肯定能实现 我又在网上找资料 还是没找 到 只是有人题四路 软模拟 于是我就思考用软模拟实现 最后在一个师兄的指点下 确实用软件模拟一个中间比较寄存器能实现 思路大概是这样子的 首先让比较寄存器装 满 也就是最大值 65535 然后通过改变模拟比较寄存器的值 每次匹配中断只需把模 拟比较寄存器的值去比较就行 具体方案看程序 unsigned char Cnt 4 一个数组 这个数组的每个元素对应一个通道 用来判断装 PWM 得高电平还是低电平数 unsigned int T 4 周期数组 unsigned int R 4 模拟的比较寄存器数组 一样的每个通道对应一个数组元素 unsigned int Rh 4 模拟的 PWM 高电平比较寄存器 unsigned int Rl 4 模拟的 PWM 低电平比较寄存器 unsigned char F 4 占空比数组 unsigned int CCR1 CCR2 CCR3 CCR4 void Init void unsigned char i 0 for i 0 i 4 i Cnt i 0 T i 0 R i 0 Rh i 0 Rl i 0 F i 0 t 的范围为 0 65536 T 0 450 F 40K T 1 600 F 30K T 2 900 F 20K T 3 1800 F 10K F 占空比 的范围为 0 100 F 0 40 F 1 30 F 2 20 F 3 10 for i 0 i 65535 R 0 R 0 65535 CCR1 R 0 TIM SetCompare1 TIM3 CCR1 if TIM GetITStatus TIM3 TIM IT CC2 RESET TIM ClearITPendingBit TIM3 TIM IT CC2 Cnt 1 Cnt 1 if Cnt 1 0 x01 R 1 Rl 1 else R 1 Rh 1 if R 1 65535 R 1 R 1 65535 CCR2 R 1 TIM SetCompare2 TIM3 CCR2 if TIM GetITStatus TIM3 TIM IT CC3 RESET TIM ClearITPendingBit TIM3 TIM IT CC3 Cnt 2 Cnt 2 if Cnt 2 0 x01 R 2 Rl 2 else R 2 Rh 2 if R 2 65535 R 2 R 2 65535 CCR3 R 2 TIM SetCompare3 TIM3 CCR3 if TIM GetITStatus TIM3 TIM IT CC4 RESET TIM ClearITPendingBit TIM3 TIM IT CC4 C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论