久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2936|回復: 4
打印 上一主題 下一主題
收起左側

單片機ADC準換的值作為PWM的占空比!弄很久一直沒有弄出來!

[復制鏈接]
跳轉到指定樓層
樓主
ID:655504 發表于 2020-5-5 09:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
求大佬幫看一下,ADC準換的值作為PWM的占空比!弄很久一直沒有弄出來!時鐘用的單片機內部22.1184mhz  身邊沒有示波器!ADC已通過串口調試過了沒有問題!唯獨PWM沒有搞定,還有一個問題想請教一下大佬們,直流電機用PWM調速一般用多大的頻率合適?STC8位PWM如果采用定時器0的溢出值作為PCA的時鐘,那么定時器的初始值該怎么計算,之前參考過好多篇文章,始終沒有解決   源程序已經打包了,所以在這里求一個具體的計算方法   最后謝謝各位大佬了!!!
  1. #include <STC8.H>
  2. #include <math.h>
  3. #include <uart.H>        // 導入串口庫文件
  4. //#include <PWM.H>
  5. #include <intrins.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. void adc_init(void);
  9. void delay100ms(void);  //誤差 -0.000000000013us
  10. void PWM_init(void);
  11. void PWM_u8init(void);
  12. void PWM_set(uchar PWM);
  13. void InitTimer0(void);
  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. sbit PWM = P1^1;
  17. /******************************************************************

  18.                                                 主函數

  19. ******************************************************************/
  20. char Data;

  21. void main(void)
  22. {
  23.         AUXR = AUXR|0x80;  // T0, 1T Mode
  24.         InitTimer0();
  25.         adc_init(); //ADC 初始化
  26.         UartInit(); // Uart 初始化
  27. //        PWM_init();
  28.         PWM_u8init();
  29.         UartSendStr("Uart test\r\t");//Uart 發送測試
  30.         while(1)
  31.         {
  32. //                SBUF = Data;
  33.                 PWM_set(Data);
  34. //                PWM = 1;
  35. //                delay100ms();   
  36. //                PWM = 0;
  37.                 delay100ms();
  38.         }
  39. }


  40. /******************************************************************

  41.                                         ADC啟動函數

  42. ******************************************************************/


  43. void adc_init(void)
  44. {
  45.         P1M0 = 0x00;
  46.         P1M1 = 0x01;       //設置P1.0口為高阻輸入
  47.         ADC_CONTR = 0x80; // 打開ADC電源    P1.0作為ADC轉換引腳
  48.         ADCCFG  = 0x0f;
  49.         EADC = 1;        // 打開ADC 中斷
  50.         EA = 1;          // 打開總中斷
  51.         ADC_CONTR |= 0x40;//啟動ADC轉換
  52. }


  53. /******************************************************************

  54.                                         ADC中斷函數

  55. ******************************************************************/
  56. void adc_zhonduan() interrupt 5 using 1
  57. {
  58.         ADC_CONTR &= ~0x20;//清楚ADC中斷溢出標志位
  59.         Data = ADC_RES;//P2讀取ADC的值
  60.         ADC_CONTR |=0x40;//繼續ADC轉換
  61. }

  62. /******************************************************************

  63.                                         軟件延時函數

  64. ******************************************************************/

  65. void delay100ms(void)   //誤差 -0.000000000013us
  66. {
  67.     unsigned char a,b,c;
  68.     for(c=254;c>0;c--)
  69.         for(b=229;b>0;b--)
  70.             for(a=8;a>0;a--);
  71.     _nop_();  
  72.     _nop_();  
  73. }

  74. /******************************************************************

  75.                                         PWM初始化函數
  76.                                            16位PWM

  77. ******************************************************************/
  78. void PWM_init(void)
  79. {
  80.         P_SW2 = 0x80;
  81.         PWMCKS = 0x00;      //PWM時鐘為系統時鐘
  82.         PWMC = 0x5667;      //設置PWM周期為1000H個PWM時鐘    約1khz
  83.         PWM0T1 = 0x5215;        //在計數值為100h地方輸出低電平
  84.         PWM0T2 = 0x0452;        //在計數值為500h地方輸出高電平
  85.         PWM0CR = 0x80;        //使能
  86.         P_SW2 = 0x00;
  87.         PWMCR = 0x80;        //啟動PWM模塊
  88. }


  89. /******************************************************************

  90.                                         PWM初始化函數
  91.                                            8位PWM
  92. *******************************************************************
  93.                                         寄存器說明
  94. CCON  PCA控制寄存器
  95. B7        B6        B5        B4        B3        B2        B1        B0
  96. CF        CR        -        -        CCF3        CCF2        CCF1        CCF0
  97. CF;計數器溢出中斷標志
  98. CR:PCA計數允許位(1/on)
  99. CCFn:PCA模塊中斷標志

  100. ********************************************************************
  101. CMOD  PCA模式寄存器
  102. B7        B6        B5        B4        B3        B2        B1        B0
  103. CIDL -         -         -           CPS[2:0]        ECF
  104. CIDL  空閑模式下是否停止計數  0繼續,1停止
  105. CPS[2:0]:PCA的輸入時鐘  【000|系統時鐘/12】【001|系統時鐘/2】【010|定時器0的溢出脈沖】【100|系統時鐘】
  106. ECF:PCA計數器溢出中斷允許位  0禁止,1允許

  107. ********************************************************************
  108. CCAPMN  PCA模塊模式控制寄存器
  109. B7        B6                B5                B4                B3                B2                B1                B0
  110. -   ECOM0    CCAPP0                CCAPN0        MAT0         TOG0                PWM0                ECCF0
  111. ECOMn:允許PCA模塊n的比較功能
  112. CCAPPN:允許PCA模塊n進行上升沿捕獲
  113. CCAPNn:允許PCA模塊n進行下降沿捕獲
  114. MATn:允許PCA的匹配功能
  115. TOG0:允許PCA模塊n的高速脈沖是輸出功能
  116. PWMn:允許PCA模塊n的脈寬輸出調制功能
  117. ECCFn:允許PCA模塊n的匹配/捕獲中斷
  118. ******************************************************************/

  119. void PWM_u8init(void)
  120. {
  121.         CCON = 0x00;        
  122.                                        
  123.         CMOD = 0x08;        //PCA時鐘為系統時鐘
  124.         CL = 0x00;
  125.         CH = 0x00;
  126.         CCAPM0 = 0x42;                //PCA模塊0為PWM工作方式
  127.         PCA_PWM0 = 0x00;   //PCA模塊0輸出8位PWM
  128.         CCAP0L = 0x10;     // 占空比
  129.         CCAP0H = 0x10;     //占空比
  130.         CR = 1;            //啟動PCA計時器
  131. }


  132. /*********************************************************************************************
  133. 函數名:PWM占空比設置函數
  134. 調  用:PWM_set(uchar PWM);
  135. 參  數:無
  136. 返回值:無
  137. 結  果:無
  138. 備  注:無
  139. /**********************************************************************************************/
  140. void PWM_set(uchar PWM)
  141. {
  142.         CCAP0L = PWM;     // 占空比
  143.         CCAP0H = PWM;     //占空比
  144. }


  145. /*********************************************************************************************
  146. 函數名:定時器初始化函數
  147. 調  用:InitTimer0();
  148. 參  數:無
  149. 返回值:無
  150. 結  果:將定時器計數器初始化為定時器,工作方式0
  151. 備  注:無
  152. /**********************************************************************************************/

  153. void InitTimer0(void)
  154. {
  155.     TMOD = 0x00;
  156.     TH0 = (65536-86)/256;//1khz
  157.     TL0 = (65536-86)%256;
  158.     EA = 1;
  159.     ET0 = 1;
  160.     TR0 = 1;
  161. }

  162. /*********************************************************************************************
  163. 函數名:定時器0中斷處理函數
  164. 調  用:無需調用
  165. 參  數:無
  166. 返回值:無
  167. 結  果:無
  168. 備  注:無
  169. /**********************************************************************************************/
  170. void Timer0Interrupt(void) interrupt 1
  171. {
  172.     TH0 = (65536-86)/256;
  173.     TL0 = (65536-86)%256;
  174. }



復制代碼


ADC.zip

75.31 KB, 下載次數: 8

源程序

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:655504 發表于 2020-5-5 09:39 | 只看該作者
發出的程序格式亂了,就請各位大佬看一下源程序把,謝謝大家了
回復

使用道具 舉報

板凳
ID:655504 發表于 2020-5-6 16:56 | 只看該作者
不要沉了呀,我頂
回復

使用道具 舉報

地板
ID:213173 發表于 2020-5-7 08:22 | 只看該作者
不用寫那么多,就把STC的ADC和PWM官方示例整合一下就行。以下程序只是提供編程思路,不代表可以直接使用。
#include <STC8.H>
#include "intrins.h"

void delay100ms(void)
{
    unsigned char a,b,c;
    for(c=254;c>0;c--)
        for(b=229;b>0;b--)
            for(a=8;a>0;a--);
    _nop_();  
    _nop_();  
}

void main()
{
        //初始化PWM
        CCON = 0x00;
        CMOD = 0x08;                                //PCA時鐘為系統時鐘
        CL = 0x00;
        CH = 0x00;       
        CCAPM0 = 0x42;                              //PCA模塊0為PWM工作模式
        PCA_PWM0 = 0x00;                            //PCA模塊0輸出8位PWM
        CCAP0L = 0xff;                              //PWM占空比為0%
        CCAP0H = 0xff;
        CR = 1;                                     //啟動PCA計時器
        //初始化ADC
        P1M0 = 0x00;                                //設置P1.0為ADC口
        P1M1 = 0x01;
        ADCCFG = 0x0f;                              //設置ADC時鐘為系統時鐘/2/16/16
        ADC_CONTR = 0x80;                           //使能ADC模塊
       
        while (1)
        {
                ADC_CONTR |= 0x40;                      //啟動AD轉換
                _nop_();
                _nop_();
                while (!(ADC_CONTR & 0x20));            //查詢ADC完成標志
                ADC_CONTR &= ~0x20;                     //清完成標志

                CCAP0H = ADC_RES;                       //讀取ADC結果控制PWM,默認P0.0輸出
//                CCAP0H = ~ADC_RES;                      //讀取ADC結果取反控制PWM
                delay100ms();
        }
}
回復

使用道具 舉報

5#
ID:261802 發表于 2020-5-13 23:33 | 只看該作者
樓主,我想產生10khz的pwm波應該怎么修改呢?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日网| 91精品久久久久久综合五月天 | 日韩av在线一区 | 欧美亚洲视频 | 午夜天堂精品久久久久 | 国产精品视频不卡 | 久久久久久成人 | 不卡一区二区在线观看 | 在线免费看毛片 | 国产一级免费视频 | 国产激情小视频 | 国产在线一区二区 | 成年人免费看的视频 | 在线日韩 | 一区二区三区在线观看视频 | 国产一区二区三区四区五区3d | 91视频进入| 欧美精品 在线观看 | 精品1区2区3区 | 国产国拍亚洲精品av | 久久天堂 | 亚洲国产成人精品女人 | 亚洲综合无码一区二区 | 欧美日一区二区 | 国产一区二区三区久久久久久久久 | 在线亚洲精品 | 国产视频久久久 | 亚洲午夜精品视频 | 中文字幕日本一区二区 | 九九精品久久久 | 欧美中文字幕在线 | 欧美日韩综合视频 | 欧美一区二区三区精品免费 | 欧美精品一区二区三区在线播放 | 久久久久国 | 久久精品中文字幕 | www.国产.com | 中文字幕影院 | 久久成人免费 | 一区二区三区四区免费视频 | 成人在线看片 |