成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

pic PWM中断

如何生成一个 pic PWM使用中断.

一些PIC微控制器已建立在 PWM内部 peripherals 很容易设置和使用,并初始化将 继续自己跑步。您所做的只是将数据发送到占空比 寄存器以更改脉冲宽度。

有时您需要一个脉冲宽度调制信号,因为设备 没有内部PWM外设,或者您需要额外的PWM外围设备。  

此页面显示如何添加软件控制中断驱动的PWM signal.  

提出了两种方法 - 第一个使用一个计时器并且没有 良好的表现是第二个。第二个使用两个定时器但具有极大的定时器 很棒的表演。你使用哪一个取决于

  1. 你剩下多少个免费定时器。
  2. 您需要多少性能(这将使用更多的模块i.e.更多 timers)..

单个计时器方法:PWM PIC中断驱动的定时器

创建PIC PWM的关键是使用其中一个定时器的中断 它用作PWM周期的分辨率计时器。在这个例子中 下面的定时器0用作分辨率计时器,并且具有33kHz或a的频率 period of 30us.

注意:这不是PWM频率。它是 只是PWM的一步的时期。

虽然20个步骤并不听起来很多,但如果你用它作为一个浅色调光器 绰绰有余。它取决于您使用的应用程序。最终产出 has a frequency of:

   pic pwm中断: Frequency = (定时器频率/否。步骤)

所以这里频率= 1.65khz

单个计时器方法:PIC PWM中断 - 定时器初始化

此示例来自16F88,在8MHz处运行内部振荡器。

void init_timer(void){

   //定时器0初始化  
   option_reg = 0x00 | (1<<7);// | (1<<3);

   //定时器0中断启用
   // OSC关闭,内部CLK,ON,零T0IF,
   //启用全局中断
   INTCON = (1<<T0IE) | (1<<GIE);
}

单个计时器方法:PIC PWM中断

这里 is the code for the PIC PWM interrupt:

void中断(void){

   //// ///////////////////////////////////////////////////////////////////////////////////
   // Timer 0
   if (INTCON & (1<<t0if))){// t0溢出?
      INTCON &= ~(1<<T0IF); //清除Timer0溢出位。

      TMR0 = 228;  // 30us

      time++;

      do_pwm();

   }   
}

单个计时器方法:PWM PIC中断 - PWM代码

从中断调用此代码以执行PWM操作。

根据PWM_VAL中设置的值,输出将打开一组 期间的数量以及时期的Coulert

void do_pwm(void){


   if (time>20) time=0;

   if (time<pwm_val)
      符合it(portb,soft_pwm_portb_pin);
   else
      RESBIT(PORTB,SOFT_PWM_PORTB_PIN);

}

描述单个中断定时PWM

使用这种方法,计时器以相当快的模式运行,这意味着 ISR(中断服务例程)必须非常小。由于中断是 发射快速主代码也不是很大。

通过这种方法,您将无法获得大量处理 all.

涉及三种功能:

  1. 在 it_timer() - 声音初始化硬件计时器时。
  2. Interrupt() - 更新全局变量'timer' at Timer 0 intervals.
  3. do_pwm() - 生成PWM信号的位置。

前两个例程设置并控制硬件计时器以生成一个 近似30us更新时间。

笔记: 中断永远不会绝对准确,但非常 紧密而且足够好。

最后一个rountine创建了PWM信号输出并限制Timervalue for restart.

笔记: do_pwm()从中断()中调用 - 您可以 将其全部放在中断例程中,因为它是中断例程的一部分。 单方面是一个选择的问题,即代码可读性,但记得 保持简短和甜蜜,因为它仍然存在"interrupt" code.

当你把一切都放在中断代码中 - 整件事可以得到巨大的 如在大代码系统中,您必须尽量为服务进行不同的中断。

表现

被要求进行微控制器的交易 在中断外部和中断的大小(包括调用 子程序)。因为您必须在中断之间留出足够的时间 processor to do its 'main' job.

在该示例中,如果16F88与8MHz内部振荡器一起使用 意味着每条指令0.5us,因此最多30 / 0.5 = 60指令 这可以在另一个中断火灾之前执行(并且包含ISR code as well..

在另一个中断之前,您可能有大约40条指令 由于您必须执行ISR指令和保存的代码 在中断之前和之后注册并恢复它们(〜20条指令?)。 您可以通过检查代码程序集输出来确切地了解。

解决此问题的解决方案是:

  • 增加主时钟(添加20MHz的外部XTAL允许许多 更多的平台,但你失去了2个引脚)。
  • 使用具有更高内部时钟的不同处理器。
  • 使用使用更多定时器的不同方法(见下文)。

下面的方法显示了两个定时器的使用,这减少了处理 burden.

双定时器方法:PIC PWM中断驱动定时器

如果您没有内部PWM模块,则此方法可以给出 准确(高分辨率)输出而不使用太多处理器 time.  

它使用第一个计时器作为PWM频率发生器。那那么 使用时间脉冲的时间段加载第二计时器 width.

它通过计算导致的定时器时钟周期数来实现这一点 所需期限(您从其他地方内部设置的时间)。

计时器通常在达到零时产生中断(已通过 通过最高价值)所以你所做的一切都是在定时器时钟的时间内完成 周期(n)并从计时器可以的最大值中减去此值 有(max-n)。因此,当计时器开始从此值计算时,它滚动 超过零计算n个时钟周期。

当第一个计时器中断时,您将PWM输出高,何时设置
第二个定时器中断您将PWM输出量设置为低。这产生了高度 分辨率PWM PIC中断驱动信号而不消耗处理 power.

双定时器方法:PIC PWM中断

这里'S用于实现高的PIC PWM中断生成器的代码 使用计时器0作为频率发生器的分辨率方法(这里是1/18ms)和 定时器1作为周期计时器(分辨率fosc / 4)。  

注意:对于不同的分辨率,更改 定时器1预分频器等

此示例来自12f675,在4MHz(内部)运行。

void中断(void){
无符号int val;

   //// ///////////////////////////////////////////////////////////////////////////////////
   // Timer 0
   if (INTCON & (1<<t0if))){// t0溢出?
      INTCON &= ~(1<<T0IF); //清除Timer0溢出位。

      // fosc / 4 x(prescale)x(计数溢出)=重复速率。
      // 1US x 128 x 140 = 18ms重复率。
      TMR0 = 256-143; //需要141但是松动TMR0松动2所以使用142

      时间++; //计算一般使用的18ms时段。

      //现在将Timer1设置为1拍摄计时器
      //为定时器1设置溢出1
      val = 65535级;

      //使用这些var来报告调试
      st_TMR1L =  val & 0x00ff;
      st_TMR1H = (val & 0xff00)>>8;

      tmr1h = st_tmr1h; //设置高1,因此不会溢出 immediately
      TMR1L = st_TMR1L;

      st_val = val;

      //启用计时器1.-每个计时器0中断或18ms = 1拍摄。
      PIE1   |= (1<<TMR1IE);

      GPIO  |= (1<<servo_bit); //设置伺服
   }

   //// ///////////////////////////////////////////////////////////////////////////////////
   // Timer 1
   if (PIR1 & (1<<TMR1IF) ) {
      PIR1 &= ~(1<<TMR1IF); //清除标志。

      GPIO  &= ~(1<<servo_bit); //重置伺服
   }

   INTCON |= (1<<T0IE); //启用计时器0。

   //注意Gie由Retfie指令设置(请参阅汇编程序输出)。
}




跳跃 pic PWM中断
最佳微控制器项目主页。

新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。



隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic.报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部