衰不堪言 发表于 2015-5-9 08:33:47

请问斑竹,stc可否输出10-20k频率可变的高速脉冲

利用pca还是pwm

有缘于你 发表于 2015-5-9 08:35:25

pca 没问题

衰不堪言 发表于 2015-5-9 08:39:37

有缘于你 发表于 2015-5-9 08:35
pca 没问题

我用它控制电机,要求频率实时可调,能做到吗

有缘于你 发表于 2015-5-9 09:21:08

看你实时精度要求了, 我用pca发过100k以内频率可变的脉冲

modbus 发表于 2015-5-9 10:36:59

这个对于STC15系列太简单了,每个定时器都有可编程频率输出功能

衰不堪言 发表于 2015-5-9 11:27:08

有缘于你 发表于 2015-5-9 09:21
看你实时精度要求了, 我用pca发过100k以内频率可变的脉冲

精度要求的确不高,我在考虑pwm模块和pca

衰不堪言 发表于 2015-5-9 11:29:10

modbus 发表于 2015-5-9 10:36
这个对于STC15系列太简单了,每个定时器都有可编程频率输出功能

定时器确实可以,但是我在最近的实验中发现,并不能实时更改频率,如果可以更改的话,请问应该如何配置,毕竟我觉得定时器可编程输出还是优于pca,因为它不需要中断

STCunio 发表于 2015-5-9 11:36:20

本帖最后由 STCunio 于 2015-5-9 11:38 编辑

5楼正解,用定时器就可以,可以满足你的要求,下面的中文注释有乱码,详细请看附件
tone函数可以发出你想要的频率,T0对应数字5。
void tone(u8 pin,u16 frequency)
{
    u8 TH_TEMP,TL_TEMP;
    u16 TIM_Value;
    switch(pin)
    {
      case 5: //T0
            TMOD &= ~0x03;        //¹¤×÷ģʽ,0: 16λ×Ô¶¯ÖØ×°, 1: 16λ¶¨Ê±/¼ÆÊý, 2: 8λ×Ô¶¯ÖØ×°, 3: 16λ×Ô¶¯ÖØ×°, ²»¿ÉÆÁ±ÎÖжÏ
            AUXR &= ~0x80;        //12T
            TMOD &= ~0x04;        //¶¨Ê±       
            INT_CLKO |= 0x01;        //Êä³öʱÖÓ
            TIM_Value = 65536UL - (MAIN_Fosc /frequency/24+0.5);                //³õÖµ
            TH_TEMP = (u8)(TIM_Value >> 8);
            TL_TEMP = (u8)TIM_Value;
            TH0=TH_TEMP;
            TL0=TL_TEMP;
            TR0=1;
            break;
      case 4: //T1

            TMOD &= ~0x30;        //¹¤×÷ģʽ,0: 16λ×Ô¶¯ÖØ×°, 1: 16λ¶¨Ê±/¼ÆÊý, 2: 8λ×Ô¶¯ÖØ×°, 3: 16λ×Ô¶¯ÖØ×°, ²»¿ÉÆÁ±ÎÖжÏ
            AUXR &= ~0x40;        //12T
            TMOD &=0x40;        //¶¨Ê±       
            INT_CLKO |= 0x02;        //Êä³öʱÖÓ
            TIM_Value   = 65536UL -(MAIN_Fosc /frequency/24+0.5);                //³õÖµ
            TH_TEMP = (u8)(TIM_Value >> 8);
            TL_TEMP = (u8)TIM_Value;
            TH1=TH_TEMP;
            TL1=TL_TEMP;
            TR1 = 1;        //¿ªÊ¼ÔËÐÐ
            break;
      case 0: //T2
                  //¶¨Ê±Æ÷2±»¹Ì¶¨Îª16λÖØװģʽ
            AUXR &= ~0x04;        //12T
            AUXR &= ~0x08;        //¶¨Ê±       
            INT_CLKO |= 0x04;        //Êä³öʱÖÓ
            TIM_Value   = 65536UL - (MAIN_Fosc /frequency/24+0.5);                //³õÖµ
            TH_TEMP = (u8)(TIM_Value >> 8);
            TL_TEMP = (u8)TIM_Value;
            T2H=TH_TEMP;
            T2L=TL_TEMP;
            AUXR |= 0x10;        //¿ªÊ¼ÔËÐÐ
            break;
      case 52://T3
            
            T4T3M &= ~0x02;        //12T
            T4T3M &= ~0x04;        //¶¨Ê±       
            T4T3M |=0x01;        //Êä³öʱÖÓ
            TIM_Value   = 65536UL - (MAIN_Fosc /frequency/24+0.5);                //³õÖµ
            TH_TEMP = (u8)(TIM_Value >> 8);
            TL_TEMP = (u8)TIM_Value;
            T3H=TH_TEMP;
            T3L=TL_TEMP;
            T4T3M |= 0x08;        //¿ªÊ¼ÔËÐÐ
            break;
      case 54://T4
      
            T4T3M &= ~0x20;        //12T
            T4T3M &= ~0x40;        //¶¨Ê±       
            T4T3M |=0x10;        //Êä³öʱÖÓ
            TIM_Value   = 65536UL - (MAIN_Fosc /frequency/24+0.5);                //³õÖµ
            TH_TEMP = (u8)(TIM_Value >> 8);
            TL_TEMP = (u8)TIM_Value;
            T4H=TH_TEMP;
            T4L=TL_TEMP;
            T4T3M |= 0x80;        //¿ªÊ¼ÔËÐÐ
            break;
      default:
            break;
    }
}

衰不堪言 发表于 2015-5-9 11:44:46

STCunio 发表于 2015-5-9 11:36
5楼正解,用定时器就可以,可以满足你的要求,下面的中文注释有乱码,详细请看附件
tone函数可以发出你想要 ...

多谢斑竹,手机无法看附件,但是能理解的的程序,现在这种是可以实现某个频率输出,但是若我想实时改变频率,即比如外部按键增加减小频率等,不知能否操作?我最近试验发现是无法实现,不知有何方法?
我是检测到有频率需要改变时禁止定时器输出,失能定时器,然后定时器值更新,再使能定时器,使能输出,发现不能改变
我在更新定时器值时不失能定时器,仍然不能输出

STCunio 发表于 2015-5-9 13:08:00

衰不堪言 发表于 2015-5-9 11:44
多谢斑竹,手机无法看附件,但是能理解的的程序,现在这种是可以实现某个频率输出,但是若我想实时改变频 ...

可以更新的,我的实例是用扬声器发出一首游戏(超级玛丽)的音乐,不同的频率声音时时切换并且没有杂音

衰不堪言 发表于 2015-5-9 13:49:31

STCunio 发表于 2015-5-9 13:08
可以更新的,我的实例是用扬声器发出一首游戏(超级玛丽)的音乐,不同的频率声音时时切换并且没有杂音 ...

那就太好了,只是我没有看到更新的操作,难道更新时就简单操作定时器初值就行了吗,还是要做其他操作?

小李非刀 发表于 2015-5-9 14:34:26

衰不堪言 发表于 2015-5-9 11:29
定时器确实可以,但是我在最近的实验中发现,并不能实时更改频率,如果可以更改的话,请问应该如何配置, ...

不知道你要多实时,最多延时半个周期。

魏道志 发表于 2015-5-9 14:39:48

PCA好些   

衰不堪言 发表于 2015-5-9 16:45:34

小李非刀 发表于 2015-5-9 14:34
不知道你要多实时,最多延时半个周期。

看斑竹的程序,每次需要修改频率,都是在重新初始化定时器,我明了了
之前我所写的程序,一个是只修改定时器初值,一个是TR0 = 0,INT_CLOK = 0,然后再修改初值,然后启动定时器,两种方式均以失败告终,请问斑竹何故?

衰不堪言 发表于 2015-6-13 21:54:48

STCunio 发表于 2015-5-9 11:36
5楼正解,用定时器就可以,可以满足你的要求,下面的中文注释有乱码,详细请看附件
tone函数可以发出你想要 ...

最近又用到了这个,照搬斑竹的程序,发现实际输出频率和程序的频率差距很大,比如我要输出20K,实测大概只有5K,请问怎么回事

ruan18278816371 发表于 2015-6-19 22:38:49

衰不堪言 发表于 2015-6-13 21:54
最近又用到了这个,照搬斑竹的程序,发现实际输出频率和程序的频率差距很大,比如我要输出20K,实测大概 ...

楼主你是不是做了分频处理了
页: [1]
查看完整版本: 请问斑竹,stc可否输出10-20k频率可变的高速脉冲