OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5667|回复: 30

呼吸灯的问题

[复制链接]

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
发表于 2018-5-3 17:53:45 | 显示全部楼层 |阅读模式
1金钱
这里面的CCRX是哪个,里面的(899,0)按照定时器里面的公式应该是
(899+1)(0+1)/72M把
为什么就变成72兆/900了??
我改变下面的LEDPWM亮灭时间就会变化,应该是周期
问题是(899,0)这个是什么东西,不是应该CNT和CCR比较吗,那么ARR又是哪个数值
32e32a5b7af2852654dcdc6851a065c.png

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 15:52:40 | 显示全部楼层
本帖最后由 程功之道 于 2018-5-4 15:53 编辑
yangtong 发表于 2018-5-4 14:19
led0pwmva是CCRx的话,那他就是0-300的加值。
你又说CNT就是往上加的值,那不是和上面的led0pwmva重复了 ...

int main(void)
{               
         u16 led0pwmval=20;   
        u16 led0pwmva2=100;
        u8 dir=1;        
        delay_init();                              
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         
        uart_init(115200);         
         LED_Init();                             
         TIM3_PWM_Init(999,719);        //这样设置周期就是10ms
           while(1)
        {
                 //delay_ms(10);           不要delay
                //if(dir)led0pwmval++;   
                //else led0pwmval--;

                 //if(led0pwmval>300)dir=0;
                //if(led0pwmval==0)dir=1;
                TIM_SetCompare2(TIM3,led0pwmval);     //占空比20
                TIM_SetCompare1(TIM3,led0pwmva2);    //占空比100
        }         
}
楼主 你按照我这样设置,用逻辑分析仪或者示波器一抓,周期就是10ms啦 ,一个灯亮点,一个灯暗点,那个delay延时10ms是为了控制呼吸时间,所以周期计算就是(arr+1)(psc+1)/72M
我是小白,很白很白的小白!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-3 17:53:46 | 显示全部楼层
899是设置ARR。。。
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-3 18:02:24 | 显示全部楼层
感觉没有体现CNT和CCR之间的比较啊,又看了一遍视频
(899,0)是ARR周期的话
那LEDPWM从0到300变化又和谁在比较
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-3 18:05:42 | 显示全部楼层
选择PWM1模式,CNT<CCR有效,选择输出高电平的话就是,CNT小于ccr时输出高电平
可是程序里面没有比较啊
只有0-300变化
比较的话应该有一个CCR的固定值把
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-3 18:08:32 | 显示全部楼层
我把下面的300变大变成1000也有呼吸灯的效果
如果(899,0)是ARR周期的话不应一直是亮吗,超过最大值了
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-3 18:14:42 | 显示全部楼层
yangtong 发表于 2018-5-3 18:02
感觉没有体现CNT和CCR之间的比较啊,又看了一遍视频
(899,0)是ARR周期的话
那LEDPWM从0到300变化又和谁 ...

在这个函数里面比较啊TIM_SetCompare2(TIM3,led0pwmval)
我是小白,很白很白的小白!!!
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 09:31:20 | 显示全部楼层
程功之道 发表于 2018-5-3 18:14
在这个函数里面比较啊TIM_SetCompare2(TIM3,led0pwmval)

我能调出来,但是不知道怎么计算时间
这个(899,0)不应该是ARR=899,SPC=0吗
根据上一章节讲的Tout(溢出时间)=(899+1)(1+0)/TCLK=900/72M
那不应该是定时时间是125us啊
占空比的值是又CCR决定的,应该是程序里面的LEDPWM的值,那CNT的值在哪
总结一下想问的问题是:怎么计算控制周期变化的时间
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 10:50:04 | 显示全部楼层
yangtong 发表于 2018-5-4 09:31
我能调出来,但是不知道怎么计算时间
这个(899,0)不应该是ARR=899,SPC=0吗
根据上一章节讲的Tout( ...

12.5us啊
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 11:02:50 | 显示全部楼层
yangtong 发表于 2018-5-4 09:31
我能调出来,但是不知道怎么计算时间
这个(899,0)不应该是ARR=899,SPC=0吗
根据上一章节讲的Tout( ...

TIM_SetCompare2(TIM3,led0pwmval)函数中的led0pwmva是CCR2,CNT就是往上加的值
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 12:04:59 | 显示全部楼层
正点原子 发表于 2018-5-3 17:53
899是设置ARR。。。

原子哥,CRR是0到300在变,ARR设置了899,PSC一分频,那么就是72M/1=72M;定时器设置向上加,那么周期是1/72M*ARR(899)? 那呼吸灯的一小段周期太短了吧 跟实验不符合啊   CNT一直加到899?   对于这个PWM我也是有这个疑问   如果按照这个设置 那么定时器中断一次是1/72M*ARR这个
我是小白,很白很白的小白!!!
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 14:19:15 | 显示全部楼层
程功之道 发表于 2018-5-4 11:02
TIM_SetCompare2(TIM3,led0pwmval)函数中的led0pwmva是CCR2,CNT就是往上加的值

led0pwmva是CCRx的话,那他就是0-300的加值。
你又说CNT就是往上加的值,那不是和上面的led0pwmva重复了吗?
还有这定时器的周期us级别太小了吧
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 14:24:42 | 显示全部楼层
yangtong 发表于 2018-5-4 14:19
led0pwmva是CCRx的话,那他就是0-300的加值。
你又说CNT就是往上加的值,那不是和上面的led0pwmva重复了 ...

TIM_SetCompare2(TIM3,led0pwmval)你去看这里面的函数,led0pwmva这个是实参
void TIM_SetCompare2 (TIM_TypeDef * TIMx, uint16_t Compare2)
{
        /* Check the parameters */
        assert_param (IS_TIM_LIST6_PERIPH (TIMx) );
        /* Set the Capture Compare2 Register value */
        TIMx->CCR2 = Compare2;
}
Compare2这个是形参,把形参的值给了CCR2,调用这个函数,那么实参的值给了CRR2
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 14:39:06 | 显示全部楼层
yangtong 发表于 2018-5-4 14:19
led0pwmva是CCRx的话,那他就是0-300的加值。
你又说CNT就是往上加的值,那不是和上面的led0pwmva重复了 ...

我上次用逻辑分析仪抓了呼吸灯波形,每12.5us,高电平变化,但是变化范围不大,整个灯由暗到亮再由亮到暗时间长,但是波形中,没看到LED灯完全暗的波形(也就是占空比百分之0),也没看到LED灯完全亮的波形(占空比百分之百的),今天看到你发的用PWM这个做呼吸灯,就很奇怪,如果用定时器直接做的话,每一小段的周期,占空比会越来越小,然后最小,再从最小越来越大,但是这个PWM做的
我是小白,很白很白的小白!!!
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 15:30:22 | 显示全部楼层
程功之道 发表于 2018-5-4 14:39
我上次用逻辑分析仪抓了呼吸灯波形,每12.5us,高电平变化,但是变化范围不大,整个灯由暗到亮再由亮到暗 ...

。。。我也不清楚啊,我就是想知道怎么计算出时间的,我用过NXP im rt1052的做PWM上示波器可以看到明显变化的
现在的问题是能搞出呼吸灯,但不知道若何定时。。。
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 15:34:13 | 显示全部楼层
程功之道 发表于 2018-5-4 14:24
TIM_SetCompare2(TIM3,led0pwmval)你去看这里面的函数,led0pwmva这个是实参
void TIM_SetCompare2 (TIM ...

那这个意思就是LEDpwm这个实参一直变化相当于CCR在ARR上的变化,比CCR小的就是高低电平喽。
这就意味着ARR就相当于CNT吧。
好的。
那就剩下那个12。5us的问题了,感觉不会这么短时间
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 15:43:57 | 显示全部楼层
yangtong 发表于 2018-5-4 14:19
led0pwmva是CCRx的话,那他就是0-300的加值。
你又说CNT就是往上加的值,那不是和上面的led0pwmva重复了 ...

delay会害死一大堆人,真搞不懂原子哥还用delay,每次比较的周期就是80K,但是led0pwmval是每10ms会变化一次,但是这个值每次都和CNT比较,所以我抓的波形是这样的,总的呼吸时间(呼吸周期)是6s(亮到暗,暗到亮)。这个CNT值变化的要快点,这个led0pwmval值变化的慢点
我是小白,很白很白的小白!!!
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 15:47:58 | 显示全部楼层
本帖最后由 yangtong 于 2018-5-4 15:49 编辑
程功之道 发表于 2018-5-4 15:43
delay会害死一大堆人,真搞不懂原子哥还用delay,每次比较的周期就是80K,但是led0pwmval是每10ms会变化 ...

你这个80K周期怎么算出来的?
好的我知道了,感谢
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 15:52:25 | 显示全部楼层
程功之道 发表于 2018-5-4 15:43
delay会害死一大堆人,真搞不懂原子哥还用delay,每次比较的周期就是80K,但是led0pwmval是每10ms会变化 ...

12.5us X 300 X 10 X2=7.5S
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 15:53:56 | 显示全部楼层
程功之道 发表于 2018-5-4 15:52
int main(void)
{               
        u16 led0pwmval=20;   

好的感谢
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 15:56:16 | 显示全部楼层
程功之道 发表于 2018-5-4 15:52
int main(void)
{               
         u16 led0pwmval=20;   

谢谢大佬
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 15:56:55 | 显示全部楼层
yangtong 发表于 2018-5-4 15:52
12.5us X 300 X 10 X2=7.5S

不要乘12.5us
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 16:02:58 | 显示全部楼层
yangtong 发表于 2018-5-4 15:52
12.5us X 300 X 10 X2=7.5S

10ms里面有800个12.5us,就是说,刚开始CRR值为0,和cnt比较,肯定小和不等于,所以占空比为0,等待10ms, led0pwmval+1 = 1;CRR就等于1,然后比较,依次循环,我这逻辑分析仪实在抓不出来到底是几秒 等我回去我试试把这个delay改短点   测试下波形
我是小白,很白很白的小白!!!
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 16:03:29 | 显示全部楼层

好的
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 16:04:59 | 显示全部楼层
程功之道 发表于 2018-5-4 16:02
10ms里面有800个12.5us,就是说,刚开始CRR值为0,和cnt比较,肯定小和不等于,所以占空比为0,等待10ms,  ...

好的好的,
还有个问题这个CNT的值是什么
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 16:13:19 | 显示全部楼层
程功之道 发表于 2018-5-4 16:02
10ms里面有800个12.5us,就是说,刚开始CRR值为0,和cnt比较,肯定小和不等于,所以占空比为0,等待10ms,  ...

ARR计算周期
CRR值0-300变化不断和CNT比较
但是没有CNT的值。。。
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 16:35:23 | 显示全部楼层
本帖最后由 程功之道 于 2018-5-4 16:42 编辑
yangtong 发表于 2018-5-4 16:13
ARR计算周期
CRR值0-300变化不断和CNT比较
但是没有CNT的值。。。

计数器从0计数到自动加载值(TIMx_ARR计数器的内容), 就是ARR
我是小白,很白很白的小白!!!
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-4 17:11:54 | 显示全部楼层
程功之道 发表于 2018-5-4 16:35
计数器从0计数到自动加载值(TIMx_ARR计数器的内容), 就是ARR

我知道ARR是自动装载值啊
PWM1模式和PWM2模式不是要求
CNT<CRR的时候有效吗
那还是没有说出CNT的值是多少啊

ARR是用来算周期的
CRR是0-300不断和CNT比较
不是应该设置比他大输出高还是低电平吗,那么比较的参量在哪
那么CNT是多少
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-4 17:41:03 | 显示全部楼层
yangtong 发表于 2018-5-4 17:11
我知道ARR是自动装载值啊
PWM1模式和PWM2模式不是要求
CNT

CNT的值也在变化啊,不是固定的值,从0加到ARR给的值,然后清0,比较是在内部啊,你设置输出高或者低就可以啊
我是小白,很白很白的小白!!!
回复

使用道具 举报

11

主题

65

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-4-10
在线时间
18 小时
 楼主| 发表于 2018-5-8 15:30:12 | 显示全部楼层
程功之道 发表于 2018-5-4 17:41
CNT的值也在变化啊,不是固定的值,从0加到ARR给的值,然后清0,比较是在内部啊,你设置输出高或者低就可 ...

没有固定值怎么比较大小,这不是要通过比较大小才能确定亮灭的占空比吗
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2018-5-8 15:35:24 | 显示全部楼层
yangtong 发表于 2018-5-8 15:30
没有固定值怎么比较大小,这不是要通过比较大小才能确定亮灭的占空比吗

这个CNT在加,CRRx也在加,每一个周期比较一次啊,2个都是寄存器而已,CNT加的快点,CRRx10ms加减一次而已
我是小白,很白很白的小白!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 02:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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