找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3106|回復(fù): 10
收起左側(cè)

用單片機(jī)管腳輸出PWM波,仿真的波形出現(xiàn)了明顯錯(cuò)誤的連續(xù)波,請問程序哪里出錯(cuò)了呢?

[復(fù)制鏈接]
ID:796670 發(fā)表于 2021-1-26 09:54 | 顯示全部樓層 |閱讀模式
本帖最后由 明日香 于 2021-1-29 10:53 編輯

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

具體單片機(jī)程序如下:
#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;   //占空比
/**單片機(jī)晶振11.0592MHZ,時(shí)鐘周期為1/11.0592us,8位定時(shí)器最大定時(shí)時(shí)間256us**/
/*11.0592MHZ除以12=921600HZ,就是1秒921600機(jī)器周期,0.1ms就是92機(jī)器周期*/
/** 輸出PWM頻率為50HZ,即周期20ms,分成兩百份,中斷200次**/
/**  定時(shí)器初值:256-92=164 **/
/*周期20ms中高電平時(shí)間為1.5ms,也就是15*0.1ms*/
void time0init()//定時(shí)器0初始化
{
   TMOD=0X02;//定時(shí)器0,工作方式2
  TH0=164;
  TL0=164;
  ET0=1;
  EA=1;
  TR0=1;//開啟定時(shí)器
}
void timer0() interrupt 1
{
   TR0=0;//賦初值時(shí)關(guān)閉定時(shí)器
   TH0=164; //定時(shí)器賦初值
   TL0=164; //定時(shí)器賦初值
   TR0=1;
  time++;
  if(time == 200)//PWM周期為0.1ms*200=20ms
  {
    time=0;
    PWM=1;
  }
    if(time == 15)//占空比為15%,高電平時(shí)間為1500us
    PWM=0;
}
void main()
{
  time0init();
  while(1)
   {
   }
}
用這是proteus仿真的波形:為啥會出現(xiàn)連續(xù)的波形呢?這明顯不對啊,請問程序哪里不對呢?
捕獲1.PNG 捕獲2.PNG



回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2021-1-26 11:16 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

ID:752974 發(fā)表于 2021-1-26 16:41 | 顯示全部樓層
STC各類單片機(jī)的應(yīng)用文檔寫的還可以,各種應(yīng)用例程都有,當(dāng)下來看看就可以了,大學(xué)畢業(yè)就應(yīng)該會學(xué)習(xí)了。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:796670 發(fā)表于 2021-1-27 15:45 | 顯示全部樓層
它為什么會出現(xiàn)連續(xù)的波形呢?應(yīng)該是一段持續(xù)的高電平才對。
回復(fù)

使用道具 舉報(bào)

ID:880958 發(fā)表于 2021-1-27 16:38 | 顯示全部樓層
個(gè)人習(xí)慣,不管是什么單片機(jī),設(shè)定定時(shí)后在定時(shí)中斷里用一個(gè)IO口取反,然后看一下定時(shí)時(shí)間對不對

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:669393 發(fā)表于 2021-1-28 00:02 | 顯示全部樓層
感覺你的思路有些混亂啊,晶振是11.0592MHZ,時(shí)鐘周期不是1/11.0592us嗎,怎么又在注釋里寫了1/12us呢?這個(gè)算錯(cuò)了之后的定時(shí)時(shí)間肯定是錯(cuò)的。照你的意思,應(yīng)該是輸出50HZ,周期0.02s的方波,把每個(gè)周期分為200份,其中15%輸出高電平,既然是這樣,高電平不應(yīng)該是200*0.15=30份嗎,或者說一個(gè)pwm周期20ms,其中高電平時(shí)間應(yīng)該是3ms,才符合15%的占空比,程序里咋寫了個(gè)1500us。。周期0.02s,分成200份,按照11.0592MHZ晶振,每一份差不多是92us,就是定時(shí)器中斷一次花的時(shí)間,用定時(shí)器0模式2就夠了,初值設(shè)為164,正常的波形應(yīng)該是圖片那樣。中斷里的程序應(yīng)該這樣寫才對
  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. }
復(fù)制代碼

pwm.png

評分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:669393 發(fā)表于 2021-1-28 00:09 | 顯示全部樓層
好像看錯(cuò)了,應(yīng)該把30改成15,按照題目的意思占空比應(yīng)該是7.5%不是15%
回復(fù)

使用道具 舉報(bào)

ID:796670 發(fā)表于 2021-1-29 10:15 | 顯示全部樓層
SPEAR 發(fā)表于 2021-1-28 00:02
感覺你的思路有些混亂啊,晶振是11.0592MHZ,時(shí)鐘周期不是1/11.0592us嗎,怎么又在注釋里寫了1/12us呢?這 ...

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

老哥,請問 “周期20ms,分成兩百份,按照11.0592MHZ,每份92us”
為什么92us初值是164呢?
不是按照65536-92+1=FFA5嗎?
然后TH0=FF,TL0=A5,請問這種算法為什么不對呢?
回復(fù)

使用道具 舉報(bào)

ID:796670 發(fā)表于 2021-1-29 10:17 | 顯示全部樓層
SPEAR 發(fā)表于 2021-1-28 00:02
感覺你的思路有些混亂啊,晶振是11.0592MHZ,時(shí)鐘周期不是1/11.0592us嗎,怎么又在注釋里寫了1/12us呢?這 ...

我知道了,我用的是定時(shí)器0模式1
回復(fù)

使用道具 舉報(bào)

ID:796670 發(fā)表于 2021-1-29 10:51 | 顯示全部樓層
SPEAR 發(fā)表于 2021-1-28 00:02
感覺你的思路有些混亂啊,晶振是11.0592MHZ,時(shí)鐘周期不是1/11.0592us嗎,怎么又在注釋里寫了1/12us呢?這 ...

老哥,發(fā)一下你完整的程序吧,謝謝了,我改了之后仿真仍然是連續(xù)波形,多謝多謝
回復(fù)

使用道具 舉報(bào)

ID:796670 發(fā)表于 2021-1-30 10:32 | 顯示全部樓層
使用方式2八位自動重裝模式的話,中斷程序里不需要再設(shè)置初值了吧
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表