搜索
bottom↓
回复: 73

KL25运行中如何动态改变PWM的占空比

[复制链接]

出0入0汤圆

发表于 2015-1-8 14:51:20 | 显示全部楼层 |阅读模式
如题,在运行中,如何动态的改变PWM的占空比 ?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-1-8 15:52:36 | 显示全部楼层
楼主是用什么方式生成pwm波的啊

出0入0汤圆

发表于 2015-1-8 17:00:00 | 显示全部楼层
关闭PWM 然后再重新赋值。。。

出0入0汤圆

发表于 2015-1-8 17:19:06 | 显示全部楼层
直接修改点空比控制寄存器,

出0入0汤圆

发表于 2015-1-8 17:55:03 | 显示全部楼层
你是用的库函数吗?还是进行寄存器操作

出0入0汤圆

发表于 2015-1-8 20:12:13 | 显示全部楼层
动态改变PWM的占空比 ,随机改变嘛 ?

出0入0汤圆

 楼主| 发表于 2015-1-8 20:14:13 | 显示全部楼层
luckner 发表于 2015-1-8 17:55
你是用的库函数吗?还是进行寄存器操作

库,但苏大的哪个库就没这个含数

出0入0汤圆

 楼主| 发表于 2015-1-8 20:15:01 | 显示全部楼层
wmm20031015 发表于 2015-1-8 17:19
直接修改点空比控制寄存器,

看来只能试试这个方法了

出0入0汤圆

发表于 2015-1-8 20:37:04 | 显示全部楼层
holts2 发表于 2015-1-8 20:14
库,但苏大的哪个库就没这个含数

看看寄存器吧,应该也不难。

出0入0汤圆

发表于 2015-1-8 20:38:11 | 显示全部楼层
你也申请了项目了?

出0入0汤圆

 楼主| 发表于 2015-1-8 20:40:28 | 显示全部楼层
luckner 发表于 2015-1-8 20:38
你也申请了项目了?

早就申请了

出0入0汤圆

发表于 2015-1-8 23:27:11 | 显示全部楼层
重新初始化 吧要

出0入0汤圆

发表于 2015-1-8 23:46:23 | 显示全部楼层
holts2 发表于 2015-1-8 20:15
看来只能试试这个方法了

等LZ公布这个方法的效果如何?

出0入0汤圆

 楼主| 发表于 2015-1-9 07:56:10 | 显示全部楼层
jinyi7016 发表于 2015-1-8 23:27
重新初始化 吧要

应用不允许重新初始化

出0入0汤圆

发表于 2015-1-10 01:01:52 来自手机 | 显示全部楼层
为什么不允许重新

出0入0汤圆

发表于 2015-1-10 10:47:08 来自手机 | 显示全部楼层
一路看来,是想发声的节奏!程序分层,先写一个带参数输入的函数来随时调整占空比。然后定时调用。

出0入0汤圆

发表于 2015-1-10 10:47:34 | 显示全部楼层
jinyi7016 发表于 2015-1-8 23:27
重新初始化 吧要

应该是不需要重新初始化

出0入0汤圆

发表于 2015-1-10 16:53:45 | 显示全部楼层
看看是如何实现动态改变PWM的占空比 的 !

出0入0汤圆

发表于 2015-1-10 17:24:25 | 显示全部楼层
改下比较的那个寄存器就行

出0入0汤圆

发表于 2015-1-10 17:29:44 | 显示全部楼层
使用封装的库比较方便,但是不够灵活,直接修改寄存器,需要认真阅读Datasheet

出0入0汤圆

发表于 2015-1-13 02:29:06 | 显示全部楼层
如果使用的硬件,允许动态修改的,库没有直接往相关寄存器中赋值

出0入0汤圆

发表于 2015-1-13 08:19:31 | 显示全部楼层
如果时间上允许的话,可以将PWM输出先关闭掉,然后重新配置在启动。

如果不允许的话,需要动态配置就需要修改占空比的参数了

出0入0汤圆

发表于 2015-1-13 08:55:03 | 显示全部楼层
这就貌似KEY控制led的亮度 通过pwm来实现的

出0入0汤圆

 楼主| 发表于 2015-1-13 09:25:16 | 显示全部楼层
zyw19987 发表于 2015-1-10 10:47
一路看来,是想发声的节奏!程序分层,先写一个带参数输入的函数来随时调整占空比。然后定时调用。 ...

不是定时调用,是按下按键才调用。

更简单 的做法是定义个全局变量作为占空比参数,按下按键我只要改这个变量的值就可以了。

出0入0汤圆

 楼主| 发表于 2015-1-13 09:27:33 | 显示全部楼层
superrf 发表于 2015-1-10 17:29
使用封装的库比较方便,但是不够灵活,直接修改寄存器,需要认真阅读Datasheet ...

苏大哪个库过于筒单,更谈不上灵活

出0入0汤圆

 楼主| 发表于 2015-1-13 09:28:15 | 显示全部楼层
秦天 发表于 2015-1-13 08:55
这就貌似KEY控制led的亮度 通过pwm来实现的

不是貌似,它就似

出0入0汤圆

 楼主| 发表于 2015-1-13 09:29:40 | 显示全部楼层
mfketggo111 发表于 2015-1-13 08:19
如果时间上允许的话,可以将PWM输出先关闭掉,然后重新配置在启动。

如果不允许的话,需要动态配置就需要 ...

不能关,关 了电机就停了,这样调速不顺滑。

出0入0汤圆

 楼主| 发表于 2015-1-13 09:31:37 | 显示全部楼层
qq开始学单片机 发表于 2015-1-13 02:29
如果使用的硬件,允许动态修改的,库没有直接往相关寄存器中赋值

允许动态修改的,只是库过于简单,我又不想看datasheet, 只好继续用库

出0入0汤圆

 楼主| 发表于 2015-1-13 09:32:33 | 显示全部楼层
walle531 发表于 2015-1-10 17:24
改下比较的那个寄存器就行


原理上是简单,问题是哪个寄存器叫什么名? 还有没有相关的要改 ? 这些都要花工夫说datasheet

出0入0汤圆

发表于 2015-1-13 09:33:12 | 显示全部楼层
holts2 发表于 2015-1-13 09:25
不是定时调用,是按下按键才调用。

更简单 的做法是定义个全局变量作为占空比参数,按下按键我只要改这 ...

用PID


   

出0入0汤圆

 楼主| 发表于 2015-1-13 09:34:56 | 显示全部楼层

不用PID,只是个简单调速

出0入0汤圆

发表于 2015-1-13 09:36:21 | 显示全部楼层
holts2 发表于 2015-1-13 09:34
不用PID,只是个简单调速

电位器无极调速呢

出0入0汤圆

发表于 2015-1-13 09:41:30 | 显示全部楼层
holts2 发表于 2015-1-13 09:32
原理上是简单,问题是哪个寄存器叫什么名? 还有没有相关的要改 ? 这些都要花工夫说datasheet ...

只需研究一下Datasheet相关章节就可以了,想省事可以请教用过的高手

出0入0汤圆

发表于 2015-1-13 09:42:20 | 显示全部楼层
holts2 发表于 2015-1-13 09:32
原理上是简单,问题是哪个寄存器叫什么名? 还有没有相关的要改 ? 这些都要花工夫说datasheet ...

这个可以去智能车论坛里找找,智能车有用KL25的,论坛里边有好多相关资料,野火什么的都相应有库,用起来也很方便

出0入0汤圆

 楼主| 发表于 2015-1-13 09:50:03 | 显示全部楼层

PWM调  速

出0入0汤圆

 楼主| 发表于 2015-1-13 09:52:20 | 显示全部楼层
superrf 发表于 2015-1-13 09:41
只需研究一下Datasheet相关章节就可以了,想省事可以请教用过的高手

是的研究一下Datasheet相关章节,或直接用库

出0入0汤圆

 楼主| 发表于 2015-1-13 09:53:34 | 显示全部楼层
《小威》 发表于 2015-1-13 09:42
这个可以去智能车论坛里找找,智能车有用KL25的,论坛里边有好多相关资料,野火什么的都相应有库,用起来 ...

话说XD申请的开源项目落实了吗?

出0入0汤圆

发表于 2015-1-13 09:54:30 | 显示全部楼层

想多了我,本意是按键改成电位器,后来想想,这根本就不能解决你的问题,请忽略

出0入0汤圆

发表于 2015-1-13 09:57:27 | 显示全部楼层
holts2 发表于 2015-1-13 09:53
话说XD申请的开源项目落实了吗?

还没有呢,这些天吧手上的活忙完了,后天出去旅游,回来准备弄一个zigbee的

出0入0汤圆

发表于 2015-1-13 10:11:33 | 显示全部楼层
KL25的定时器原味移植自它的8位机,蛋疼的芯片版本改来改去,几年时间改了几次,而且没有勘误或者修改说明,搞得老是要改动程序。

出0入0汤圆

发表于 2015-1-13 11:20:01 | 显示全部楼层
楼主你好
建议你看一下参考手册KL25P80M48SF0RM的“31.3.5 Channel (n) Value (TPMx_CnV)”和31.4.8.2 CnV Register Update章节。

可以直接改TPMx_CnV寄存器改变占空比的,没必要关闭模块重新初始化。

出0入0汤圆

发表于 2015-1-13 11:24:40 | 显示全部楼层
holts2 发表于 2015-1-13 09:31
允许动态修改的,只是库过于简单,我又不想看datasheet, 只好继续用库

原来如此,像STM8之类的,好像都不提供这种库,我都是直接给寄存器赋值的

出0入0汤圆

 楼主| 发表于 2015-1-13 13:01:46 | 显示全部楼层
qq开始学单片机 发表于 2015-1-13 11:24
原来如此,像STM8之类的,好像都不提供这种库,我都是直接给寄存器赋值的 ...

STM8 有库的,官方的库写的很好,很方便

出0入0汤圆

发表于 2015-1-13 13:06:09 | 显示全部楼层
holts2 发表于 2015-1-13 09:29
不能关,关 了电机就停了,这样调速不顺滑。

那只能是取动态参数了。

动态参数设置占空比,这个参数可以铜鼓哦外部输入或者PID整定。

出0入0汤圆

 楼主| 发表于 2015-1-13 13:08:48 | 显示全部楼层
mfketggo111 发表于 2015-1-13 13:06
那只能是取动态参数了。

动态参数设置占空比,这个参数可以铜鼓哦外部输入或者PID整定。 ...

同    步  ?

出0入0汤圆

发表于 2015-1-13 13:09:28 | 显示全部楼层
holts2 发表于 2015-1-13 13:01
STM8 有库的,官方的库写的很好,很方便

是有库,只是没有单纯调节占空比的而已,不过就两个寄存器,也没必要为他建立一个单独的库,所以我都是直接写寄存器

出0入0汤圆

 楼主| 发表于 2015-1-13 13:20:38 | 显示全部楼层
qq开始学单片机 发表于 2015-1-13 13:09
是有库,只是没有单纯调节占空比的而已,不过就两个寄存器,也没必要为他建立一个单独的库,所以我都是直 ...


学妹是不是这样 ?



  1. /**
  2.   ***************************************************************
  3.   * @brief Set DutyCycle value
  4.   * @par Parameters: None
  5.   * @retval void None
  6.   * @par Required preconditions: None
  7.   ***************************************************************
  8.   */
  9. void SetTIM1_PWM_DutyCycle(uint16_t TIM1_Pulse)
  10. {
  11.         /* Set the Pulse value */
  12.         TIM1->CCR3H = (uint8_t)(TIM1_Pulse >> 8);
  13.         TIM1->CCR3L = (uint8_t)(TIM1_Pulse);
  14.         /* Set the Pulse value */
  15.         TIM1->CCR4H = (uint8_t)(TIM1_Pulse >> 8);
  16.         TIM1->CCR4L = (uint8_t)(TIM1_Pulse);
  17. }
复制代码

出0入0汤圆

发表于 2015-1-13 13:34:16 | 显示全部楼层
holts2 发表于 2015-1-13 13:20
学妹是不是这样 ?

看来是我看库看不仔细了,看不到,我以为没有,哈哈,我直接给扔寄存器了

出0入0汤圆

 楼主| 发表于 2015-1-13 13:39:43 | 显示全部楼层
qq开始学单片机 发表于 2015-1-13 13:34
看来是我看库看不仔细了,看不到,我以为没有,哈哈,我直接给扔寄存器了 ...

你看的很仔细,确实没有现成的,这个是我写的含数, KL25也是一个道理,也准备这样做,哪位XD知道KL25应该对哪个寄存器下手 ?

出0入0汤圆

发表于 2015-1-13 13:40:46 | 显示全部楼层
holts2 发表于 2015-1-13 13:20
学妹是不是这样 ?


找不到啊,你是自己写的吧,居然写出了官方库的味道,敬佩,我是用这个软件来找函数的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-1-13 13:44:01 | 显示全部楼层
本帖最后由 holts2 于 2015-1-13 13:45 编辑
qq开始学单片机 发表于 2015-1-13 13:40
找不到啊,你是自己写的吧,居然写出了官方库的味道,敬佩,我是用这个软件来找函数的
...


你误认为官方的了

这个很简单,把Init(), 复制过来改改就OK了

出0入0汤圆

发表于 2015-1-13 13:53:15 | 显示全部楼层
holts2 发表于 2015-1-13 13:44
你误认为官方的了

这个很简单,把Init(), 复制过来改改就OK了

好吧,这种我还要学学你才行,哈哈
------------------------------------------------------------------
KL25的占空比由CnV决定,你可以找找这个寄存器

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-1-13 14:25:18 | 显示全部楼层
qq开始学单片机 发表于 2015-1-13 13:53
好吧,这种我还要学学你才行,哈哈
----------------------------------------------------------------- ...

学妹真是个细心的人, 如法泡制,贴个苏大的库改编的设置涵数,算是抛砖引玉



  1. //=========================================================================
  2. //函数名称:pwm_duty                                                      
  3. //功能概要:pwm模块占空比调置
  4. //参数说明:tpmModule:模块号:0、1、2  
  5. // channel:  通道号:0-6
  6. //period  :周期 单位微秒(比如0.1ms为100,1ms为1000)   
  7. //duty    :占空比    1-100                                                                  
  8. //函数返回:无
  9. //=========================================================================
  10. void pwm_duty(uint_8 tpmModule,uint_8 channel,uint_32 period,uint_8 duty)
  11. {
  12.         //与TPM的计算方法一致:PLL/2时钟48000Khz/1000*0.1(ms), 0.1ms中断一次,0.2ms为一个周期  
  13.         period=48000*period/1000;
  14.         TPM_ARR[tpmModule]->MOD = period;
  15.         TPM_ARR[tpmModule]->SC = TPM_SC_TOIE_MASK|TPM_SC_CMOD(1);

  16.         //设置TPM为边沿对齐pwm
  17.         TPM_CnSC_REG(TPM_ARR[tpmModule],channel)=TPM_CnSC_MSB_MASK|TPM_CnSC_ELSA_MASK;
  18.         TPM_CnV_REG(TPM_ARR[tpmModule],channel)=period*duty/100;
  19. }

复制代码

出0入0汤圆

发表于 2015-1-13 14:49:21 | 显示全部楼层
qq开始学单片机 发表于 2015-1-13 13:40
找不到啊,你是自己写的吧,居然写出了官方库的味道,敬佩,我是用这个软件来找函数的
...

这个是STM8的,飞思卡尔能用?

出0入0汤圆

发表于 2015-1-13 15:07:06 | 显示全部楼层
holts2 发表于 2015-1-13 14:25
学妹真是个细心的人, 如法泡制,贴个苏大的库改编的设置涵数,算是抛砖引玉

...

顿时邪恶的思想产生了,ctrl+C ... ctrl+V,收走了

出0入0汤圆

发表于 2015-1-13 15:08:41 | 显示全部楼层
holts2 发表于 2015-1-13 14:25
学妹真是个细心的人, 如法泡制,贴个苏大的库改编的设置涵数,算是抛砖引玉

...

提个建议,period和duty最好是分开两个函数,这样用起来更加方便

出0入0汤圆

发表于 2015-1-13 15:13:35 | 显示全部楼层
superrf 发表于 2015-1-13 14:49
这个是STM8的,飞思卡尔能用?

只是打个比喻而已

出0入0汤圆

发表于 2015-1-13 15:35:50 | 显示全部楼层
其他单片机用过,很简单, 改一个比较通道的寄存器就行.
就算改周期也没必要重新初始化timer

出0入0汤圆

 楼主| 发表于 2015-1-13 15:49:38 | 显示全部楼层
本帖最后由 holts2 于 2015-1-13 15:53 编辑
qq开始学单片机 发表于 2015-1-13 15:07
顿时邪恶的思想产生了,ctrl+C ... ctrl+V,收走了


我还没验证过哈, 话说学妹为么不去申请个开源项目,搞块KL25, 一起玩啊 ?

出0入0汤圆

 楼主| 发表于 2015-1-13 15:52:32 | 显示全部楼层
qq开始学单片机 发表于 2015-1-13 15:08
提个建议,period和duty最好是分开两个函数,这样用起来更加方便

说来惭愦啊,我还没彻底看懂苏大的库,只是将它的INIT砍了剩下我要的代码,奏合者先用。

出0入0汤圆

发表于 2015-1-13 17:12:17 | 显示全部楼层
holts2 发表于 2015-1-13 15:52
说来惭愦啊,我还没彻底看懂苏大的库,只是将它的INIT砍了剩下我要的代码,奏合者先用。

...

这两个不需要懂,直接送就行了

出0入0汤圆

发表于 2015-1-13 17:37:37 | 显示全部楼层
初始化好了之后,在运行过程中 直接将数值赋给CnV(没记错的话 应该是这个)就行了。

出0入0汤圆

 楼主| 发表于 2015-1-13 19:22:13 | 显示全部楼层
qq开始学单片机 发表于 2015-1-13 17:12
这两个不需要懂,直接送就行了

只实现功能是可以的,但要将涵数写的漂亮,还是要熟悉库

出0入0汤圆

 楼主| 发表于 2015-1-13 19:22:53 | 显示全部楼层
含情别问我 发表于 2015-1-13 17:37
初始化好了之后,在运行过程中 直接将数值赋给CnV(没记错的话 应该是这个)就行了。 ...

是的上面的涵数就是干这个工作

出0入0汤圆

发表于 2015-1-13 20:54:14 | 显示全部楼层
同意4楼,应该不用初始化。

出0入0汤圆

发表于 2015-1-14 12:56:31 | 显示全部楼层
直接对FTMx_CnV赋值

出0入0汤圆

发表于 2015-1-15 09:53:20 | 显示全部楼层
如果要停止了才能赋值,那肯定是个重大缺陷了。
按照常理,将寄存器内容改变就可以了。

出0入0汤圆

 楼主| 发表于 2015-1-17 08:41:13 | 显示全部楼层
leicai05 发表于 2015-1-15 09:53
如果要停止了才能赋值,那肯定是个重大缺陷了。
按照常理,将寄存器内容改变就可以了。 ...

关键是停了,电机了也停了

出0入0汤圆

发表于 2015-1-17 08:57:49 | 显示全部楼层
直接改需要改变通道的比较寄存器的值

出0入0汤圆

发表于 2015-1-17 09:17:48 | 显示全部楼层
holts2 发表于 2015-1-17 08:41
关键是停了,电机了也停了

改寄存器内容不需要停止输出吧,飞思卡尔的片子不会那么差

出0入0汤圆

 楼主| 发表于 2015-1-17 09:21:25 | 显示全部楼层
superrf 发表于 2015-1-17 09:17
改寄存器内容不需要停止输出吧,飞思卡尔的片子不会那么差

当然不用

出0入0汤圆

发表于 2015-1-17 09:25:45 | 显示全部楼层
看芯片手册,根据寄存器写底层库就好了,应该没多少行代码

出110入109汤圆

发表于 2015-2-7 15:13:31 | 显示全部楼层
FSL_TICS_Robin 发表于 2015-1-13 11:20
楼主你好
建议你看一下参考手册KL25P80M48SF0RM的“31.3.5 Channel (n) Value (TPMx_CnV)”和31.4.8.2 CnV  ...

KSDK里可有修改CnV寄存器的函数的?
这个CnV寄存器是双缓冲的,一般在溢出中断里重新赋初值?
In output modes, writing to a CnV register latches the value into a buffer. A CnV register is updated with the value of its write buffer according to Registers updated from write buffers.

出0入0汤圆

 楼主| 发表于 2015-2-8 22:11:56 | 显示全部楼层
xiexie943 发表于 2015-1-17 09:25
看芯片手册,根据寄存器写底层库就好了,应该没多少行代码

直接用库含数
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-17 17:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表