关于发变频固定脉冲数PWM的方法

qq_31195831 2016-11-15 05:10:48
1.使用两个定时器
2.定时器A发PWM,另外一个定时器B周期是1ms;
3.定时器A的中断里面做标志的判断,当前是加速还是减速,或者是匀速,标志位传递到定时器B中断里,定时器B中断里面进行频率数值的加减,同时在一个其他的主循环函数里面进行定时器ARR的赋值(可以保证“实时”的改变频率值);
4.那么问题来了,这样做,两个中断之间的数据传递会有问题吗?比如标志位会改变等等,坐等大神回复。
...全文
704 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
小方木 2020-03-30
  • 打赏
  • 举报
回复


是这样的吗
qq_31195831 2016-12-23
  • 打赏
  • 举报
回复
引用 9 楼 pcalling 的回复:
[quote=引用 7 楼 lr2131 的回复:] [quote=引用 6 楼 qq_31195831 的回复:] [quote=引用 5 楼 lr2131 的回复:] 你是不是要做变频的PWM,B定时器做变频,A做PWM? 全局变量,注意带关键字volatile,然后,如果读写的话,看看要不要加临界区的加解锁,可以的话,尽量不要用。
为什么要加volatile关键字呢,和不用有什么区别吗,能麻烦解释一下吗[/quote] 给你个总结,全局变量,在多线程或者类似于“多线程”的中读写访问,都应该加这个关键字,否者,出现读“脏数据”的现象。 多线程自不必多说,单片机上的操作系统,你用过就该知道多线程的情况。 但如果不上任何操作系统,中断和中断,中断和main也可以理解成“多线程”的性质。 为什么要加voaltile,这是单片机嵌入式工程师必须要清楚的,不然经常栽更头还不知道是什么原因。 不加volatile,编译器会把全局变量优化到寄存器中,有时甚至优化到cache中,不同的线程在访问这个全局变量时,有的线程读取的是这个全局变量的原始地址,有的线程访问的是这个线程在优化后的寄存器或cache,如果线程交错访问,就可能出现读到脏数据的现象,导致程序渐入错误的流程。 [/quote] 总结的很好啊。我想说我一般会用register关键字。[/quote] 这是为什么呢,嚎
pcalling 2016-12-22
  • 打赏
  • 举报
回复
引用 7 楼 lr2131 的回复:
[quote=引用 6 楼 qq_31195831 的回复:] [quote=引用 5 楼 lr2131 的回复:] 你是不是要做变频的PWM,B定时器做变频,A做PWM? 全局变量,注意带关键字volatile,然后,如果读写的话,看看要不要加临界区的加解锁,可以的话,尽量不要用。
为什么要加volatile关键字呢,和不用有什么区别吗,能麻烦解释一下吗[/quote] 给你个总结,全局变量,在多线程或者类似于“多线程”的中读写访问,都应该加这个关键字,否者,出现读“脏数据”的现象。 多线程自不必多说,单片机上的操作系统,你用过就该知道多线程的情况。 但如果不上任何操作系统,中断和中断,中断和main也可以理解成“多线程”的性质。 为什么要加voaltile,这是单片机嵌入式工程师必须要清楚的,不然经常栽更头还不知道是什么原因。 不加volatile,编译器会把全局变量优化到寄存器中,有时甚至优化到cache中,不同的线程在访问这个全局变量时,有的线程读取的是这个全局变量的原始地址,有的线程访问的是这个线程在优化后的寄存器或cache,如果线程交错访问,就可能出现读到脏数据的现象,导致程序渐入错误的流程。 [/quote] 总结的很好啊。我想说我一般会用register关键字。
lr2131 2016-11-16
  • 打赏
  • 举报
回复
你是不是要做变频的PWM,B定时器做变频,A做PWM? 全局变量,注意带关键字volatile,然后,如果读写的话,看看要不要加临界区的加解锁,可以的话,尽量不要用。
qq_31195831 2016-11-16
  • 打赏
  • 举报
回复
引用 3 楼 xuweiwei1860 的回复:
[quote=引用 2 楼 qq_31195831 的回复:] [quote=引用 1 楼 xuweiwei1860 的回复:] 简单就用一个全局变量
哥们,你说的好轻松啊。。。[/quote] 我做过啊 开启两个定时器,在中断处理函数中分别设置gpio 的输出0和1。主函数中计算频率然后修改定时器的定时时间。真不难[/quote] 你做的是翻转。。。 我说的是定时器的PWM功能,还要做加减速 如果说的不是一回事就别回复了。。。谢谢大神
fly 100% 2016-11-16
  • 打赏
  • 举报
回复
引用 2 楼 qq_31195831 的回复:
[quote=引用 1 楼 xuweiwei1860 的回复:] 简单就用一个全局变量
哥们,你说的好轻松啊。。。[/quote] 我做过啊 开启两个定时器,在中断处理函数中分别设置gpio 的输出0和1。主函数中计算频率然后修改定时器的定时时间。真不难
qq_31195831 2016-11-16
  • 打赏
  • 举报
回复
引用 1 楼 xuweiwei1860 的回复:
简单就用一个全局变量
哥们,你说的好轻松啊。。。
fly 100% 2016-11-16
  • 打赏
  • 举报
回复
简单就用一个全局变量
qq_31195831 2016-11-16
  • 打赏
  • 举报
回复
引用 7 楼 lr2131 的回复:
[quote=引用 6 楼 qq_31195831 的回复:] [quote=引用 5 楼 lr2131 的回复:] 你是不是要做变频的PWM,B定时器做变频,A做PWM? 全局变量,注意带关键字volatile,然后,如果读写的话,看看要不要加临界区的加解锁,可以的话,尽量不要用。
为什么要加volatile关键字呢,和不用有什么区别吗,能麻烦解释一下吗[/quote] 给你个总结,全局变量,在多线程或者类似于“多线程”的中读写访问,都应该加这个关键字,否者,出现读“脏数据”的现象。 多线程自不必多说,单片机上的操作系统,你用过就该知道多线程的情况。 但如果不上任何操作系统,中断和中断,中断和main也可以理解成“多线程”的性质。 为什么要加voaltile,这是单片机嵌入式工程师必须要清楚的,不然经常栽更头还不知道是什么原因。 不加volatile,编译器会把全局变量优化到寄存器中,有时甚至优化到cache中,不同的线程在访问这个全局变量时,有的线程读取的是这个全局变量的原始地址,有的线程访问的是这个线程在优化后的寄存器或cache,如果线程交错访问,就可能出现读到脏数据的现象,导致程序渐入错误的流程。 [/quote] 多谢,明白了
lr2131 2016-11-16
  • 打赏
  • 举报
回复
引用 6 楼 qq_31195831 的回复:
[quote=引用 5 楼 lr2131 的回复:] 你是不是要做变频的PWM,B定时器做变频,A做PWM? 全局变量,注意带关键字volatile,然后,如果读写的话,看看要不要加临界区的加解锁,可以的话,尽量不要用。
为什么要加volatile关键字呢,和不用有什么区别吗,能麻烦解释一下吗[/quote] 给你个总结,全局变量,在多线程或者类似于“多线程”的中读写访问,都应该加这个关键字,否者,出现读“脏数据”的现象。 多线程自不必多说,单片机上的操作系统,你用过就该知道多线程的情况。 但如果不上任何操作系统,中断和中断,中断和main也可以理解成“多线程”的性质。 为什么要加voaltile,这是单片机嵌入式工程师必须要清楚的,不然经常栽更头还不知道是什么原因。 不加volatile,编译器会把全局变量优化到寄存器中,有时甚至优化到cache中,不同的线程在访问这个全局变量时,有的线程读取的是这个全局变量的原始地址,有的线程访问的是这个线程在优化后的寄存器或cache,如果线程交错访问,就可能出现读到脏数据的现象,导致程序渐入错误的流程。
qq_31195831 2016-11-16
  • 打赏
  • 举报
回复
引用 5 楼 lr2131 的回复:
你是不是要做变频的PWM,B定时器做变频,A做PWM? 全局变量,注意带关键字volatile,然后,如果读写的话,看看要不要加临界区的加解锁,可以的话,尽量不要用。
为什么要加volatile关键字呢,和不用有什么区别吗,能麻烦解释一下吗

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧