欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 用單片機管腳輸出PWM波,仿真的波形出現了明顯錯誤的連續波,請問程序哪里出錯了呢? [打印本頁]

作者: 明日香    時間: 2021-1-26 09:54
標題: 用單片機管腳輸出PWM波,仿真的波形出現了明顯錯誤的連續波,請問程序哪里出錯了呢?
本帖最后由 明日香 于 2021-1-29 10:53 編輯

用定時器0,任選一管腳P21,使其輸出頻率50HZ,周期20ms,輸出1500us的高電平時間

具體單片機程序如下:
#include <stc12c5a.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define uchar unsigned char
#define uint  unsigned int
sbit PWM=P2^1;//P21輸出PWM波   
uchar time=0;   //占空比
/**單片機晶振11.0592MHZ,時鐘周期為1/11.0592us,8位定時器最大定時時間256us**/
/*11.0592MHZ除以12=921600HZ,就是1秒921600機器周期,0.1ms就是92機器周期*/
/** 輸出PWM頻率為50HZ,即周期20ms,分成兩百份,中斷200次**/
/**  定時器初值:256-92=164 **/
/*周期20ms中高電平時間為1.5ms,也就是15*0.1ms*/
void time0init()//定時器0初始化
{
   TMOD=0X02;//定時器0,工作方式2
  TH0=164;
  TL0=164;
  ET0=1;
  EA=1;
  TR0=1;//開啟定時器
}
void timer0() interrupt 1
{
   TR0=0;//賦初值時關閉定時器
   TH0=164; //定時器賦初值
   TL0=164; //定時器賦初值
   TR0=1;
  time++;
  if(time == 200)//PWM周期為0.1ms*200=20ms
  {
    time=0;
    PWM=1;
  }
    if(time == 15)//占空比為15%,高電平時間為1500us
    PWM=0;
}
void main()
{
  time0init();
  while(1)
   {
   }
}
用這是proteus仿真的波形:為啥會出現連續的波形呢?這明顯不對啊,請問程序哪里不對呢?





作者: 人人學會單片機    時間: 2021-1-26 11:16
可以看看這個貼子:http://m.raoushi.com/bbs/dpj-200820-1.html
作者: munuc_w    時間: 2021-1-26 16:41
STC各類單片機的應用文檔寫的還可以,各種應用例程都有,當下來看看就可以了,大學畢業就應該會學習了。
作者: 明日香    時間: 2021-1-27 15:45
它為什么會出現連續的波形呢?應該是一段持續的高電平才對啊?
作者: NeverMind    時間: 2021-1-27 16:38
個人習慣,不管是什么單片機,設定定時后在定時中斷里用一個IO口取反,然后看一下定時時間對不對
作者: SPEAR    時間: 2021-1-28 00:02
感覺你的思路有些混亂啊,晶振是11.0592MHZ,時鐘周期不是1/11.0592us嗎,怎么又在注釋里寫了1/12us呢?這個算錯了之后的定時時間肯定是錯的。照你的意思,應該是輸出50HZ,周期0.02s的方波,把每個周期分為200份,其中15%輸出高電平,既然是這樣,高電平不應該是200*0.15=30份嗎,或者說一個pwm周期20ms,其中高電平時間應該是3ms,才符合15%的占空比,程序里咋寫了個1500us。。周期0.02s,分成200份,按照11.0592MHZ晶振,每一份差不多是92us,就是定時器中斷一次花的時間,用定時器0模式2就夠了,初值設為164,正常的波形應該是圖片那樣。中斷里的程序應該這樣寫才對
  1. void timer0() interrupt 1
  2. {
  3.         TH0 = 164;
  4.         TL0 = 164;
  5.         t++;
  6.         if(t == 200)
  7.         {
  8.                 pwm =1;
  9.                 t =0;
  10.         }
  11.         if(t == 30)
  12.         pwm = 0;               
  13. }
復制代碼

pwm.png (93.81 KB, 下載次數: 120)

pwm.png

作者: SPEAR    時間: 2021-1-28 00:09
好像看錯了,應該把30改成15,按照題目的意思占空比應該是7.5%不是15%
作者: 明日香    時間: 2021-1-29 10:15
SPEAR 發表于 2021-1-28 00:02
感覺你的思路有些混亂啊,晶振是11.0592MHZ,時鐘周期不是1/11.0592us嗎,怎么又在注釋里寫了1/12us呢?這 ...

是我表述的不清楚,周期20ms其中高電平為1.5ms(也就是1500us)

老哥,請問 “周期20ms,分成兩百份,按照11.0592MHZ,每份92us”
為什么92us初值是164呢?
不是按照65536-92+1=FFA5嗎?
然后TH0=FF,TL0=A5,請問這種算法為什么不對呢?
作者: 明日香    時間: 2021-1-29 10:17
SPEAR 發表于 2021-1-28 00:02
感覺你的思路有些混亂啊,晶振是11.0592MHZ,時鐘周期不是1/11.0592us嗎,怎么又在注釋里寫了1/12us呢?這 ...

我知道了,我用的是定時器0模式1
作者: 明日香    時間: 2021-1-29 10:51
SPEAR 發表于 2021-1-28 00:02
感覺你的思路有些混亂啊,晶振是11.0592MHZ,時鐘周期不是1/11.0592us嗎,怎么又在注釋里寫了1/12us呢?這 ...

老哥,發一下你完整的程序吧,謝謝了,我改了之后仿真仍然是連續波形,多謝多謝
作者: 明日香    時間: 2021-1-30 10:32
使用方式2八位自動重裝模式的話,中斷程序里不需要再設置初值了吧




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1