我使用 C 语言为 PIC18F 生成音调,以便每个音调以特定的时间间隔播放。我使用 PWM 来产生音调。但我不知道如何创建间隔。这是我的尝试。
#pragma code //
void main (void)
{
int i=0;
// set internal oscillator to 1MHz
//OSCCON = 0b10110110; // IRCFx = 101
//OSCTUNEbits.PLLEN = 0; //PLL disabled
TRISDbits.TRISD7 = 0;
T2CON = 0b00000101; //timer2 on
PR2 = 240;
CCPR1L = 0x78;
CCP1CON= 0b01001100;
LATDbits.LATD7=0;
Delay1KTCYx(1000);
while(1);
}
最佳答案
当我进行嵌入式编程时,我发现添加注释来准确解释我在设置配置寄存器时的意图非常有用。这样,当我下次必须更改代码时,我不必返回数据表来弄清楚 0x01001010
的作用。 (请确保评论与更改保持同步)。
根据我可以解码的内容,您似乎已经设置了 PWM 寄存器,但无法按照所需的时间间隔更改频率。有几种方法可以做到这一点,这里有两个想法:
- 您可以在启动时读取计时器,添加所需的间隔以获取目标时间,并在 while 循环中轮询计时器。当计时器达到目标时,设置新的 PWM 占空比,并将下一个间隔添加到目标时间。这将工作得很好,直到您需要开始在后台循环中执行其他操作。
- 您可以将timer0的计数设置为
0xFFFF-interval
,并将其设置为在翻转时中断。在ISR中,设置新的PWM占空比,并将timer0计数重置为下一个间隔。
控制嵌入式进程时序的一种常见方法如下所示:
int flag=0;
void main()
{
setup_interrupt(); //schedule interrupt for desired time.
while (1)
{
if (flag)
{
update_something();
flag = 0;
}
}
flag
在哪里设置?在中断处理程序中:
void InterruptHandler()
{
flag = 1;
acknowledge_interupt_reg = 0;
}
您已经拥有示例中的所有部分,只需将它们放在正确的位置即可。在您的情况下,update_something()
将更新 PWM。逻辑如下:“如果它已打开,则将其关闭;否则将其打开。如果需要,请更新音调(占空比)”
主 while 循环中不需要额外的延迟或暂停。目标是它一遍又一遍地运行,等待执行某些操作。如果程序需要以不同的速率做其他事情,可以添加另一个标志,该标志完全独立触发,两个任务的时间不会互相干扰。
关于c - 使用C编程以一定的时间间隔产生音调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/603313/