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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

ATMEGA16單片機Timer1的OC1A腳輸出占空比可調的PWM信號

[復制鏈接]
跳轉到指定樓層
樓主
     采用快速PWM方式,通過按鍵設置OCR1A的值,從而改變占空比;
     當數值超出界限時,以了LED和LCD
的方式報警;
     輸出經過濾波可以得到直流信號,改變占空比,輸出不一樣。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #define MAIN_C
  2. #include "includes.h"
  3. /***************************/
  4. /*PWM*/
  5. /*晶振為4MHz*/
  6. /*利用Timer1的OC1A腳輸出占空比可調的信號*/
  7. /*通過按鍵控制OCR1A的值*/
  8. /***************************/

  9. #define PwmOut     PD5     //A通道的PWM輸出
  10. #define OCR        OCR1A
  11. #define KeyUp      PA0     //增大PWM值的按鍵
  12. #define KeyDown    PA1     //減小PWM值的按鍵
  13. #define Above      PA2     //設置位值過高指示
  14. #define Below      PA3     //設置位值過低指示
  15. #define STEP       64      //定義按鍵時的步進值
  16. int OcrReg = 1024;         //OCR1A初始值
  17. int Icr1Reg = 0x7ff;       //PWM的計數頂部值  Icr1Reg = 2047
  18. //unsigned char *show = "0000";
  19. unsigned char temp;

  20. void init(void)   //初始化函數
  21. {
  22.     //比較匹配時清零,計數到最大時置位OC1A
  23.     TCCR1A |= (1<<COM1A1)|(1<<WGM11);  
  24.     //11位分辨率,快速PWM模式,使用系統時鐘作為計數時鐘
  25.     TCCR1B |= (1<<WGM13)|(1<<WGM12)|(1<<CS10);
  26.     ICR1   = Icr1Reg;  
  27.     OCR    = 0 ;
  28.     DDRD  |= (1<<PwmOut);          //置PWM為輸出
  29.     DDRA  |= (1<<Above)|(1<<Below);      //指示燈定義為輸出
  30.     DDRA  &= ~((1<<KeyUp)|(1<<KeyDown)); //按鍵定義為輸入
  31.     PORTA |= (1<<KeyUp)|(1<<KeyDown);    //按鍵開啟上拉
  32.     PORTA |= (1<<Above)|(1<<Below);      //關閉兩個指示燈
  33.     //TIMSK |= (1<<OCIE1A);   //允許計數器比較匹配中斷
  34.     //SREG  |= (1<<7);   //開全局中斷
  35. }

  36. void  ShowValue(int value)
  37. {
  38.     unsigned char *temp = "0000";
  39.     temp[0] = value/1000 + 0x30;
  40.     value = value%1000;
  41.     temp[1] = value/100 +0x30;
  42.     value = value%100;
  43.     temp[2] = value/10 + 0x30;
  44.     value = value%10;
  45.     temp[3] = value + 0x30;  
  46.     ClearLine(2);
  47.     LCD_DisplayString(2,1,"OCR1A = ");
  48.     LCD_DisplayString(2,9,temp);  
  49. }

  50. void main(void)
  51. {
  52.     unsigned char i;
  53.     init();
  54.     Init_LCD();
  55.     OCR = OcrReg;
  56.     LCD_DisplayString(1,1,"PWM test");
  57.     LCD_DisplayString(2,1,"OCR1A = ");
  58.     ShowValue(OcrReg);
  59.     while(1)
  60.     {               
  61.         if(!(PINA&(1<<KeyUp)))
  62.         {
  63.             delay_nms(10);    //按鍵消抖
  64.             if(!(PINA&(1<<KeyUp)))
  65.             {
  66.                 while(!(PINA&(1<<KeyUp)));  //等待按鍵釋放
  67.                 if(OcrReg >= (Icr1Reg+1))
  68.                 {
  69.                     for(i=0;i<5;i++)
  70.                     {
  71.                         PORTA ^= (1<<Above);
  72.                         delay_nms(200);
  73.                     }
  74.                     ClearLine(2);
  75.                     LCD_DisplayString(2,1,"Value MAX!");
  76.                 }
  77.                 else
  78.                 {
  79.                     PORTA |= (1<<Above);
  80.                     OcrReg += STEP;                    
  81.                     OCR = OcrReg;
  82.                     ShowValue(OcrReg);
  83.                 }
  84.             }
  85.         }
  86.         if(!(PINA&(1<<KeyDown)))
  87.         {
  88.             delay_nms(10);    //按鍵消抖
  89.             if(!(PINA&(1<<KeyDown)))
  90.             {
  91.                 while(!(PINA&(1<<KeyDown)));  //等待按鍵釋放
  92.                 if(OcrReg <= 0)
  93.                 {
  94.                     for(i=0;i<5;i++)
  95.                     {
  96.                         PORTA ^= (1<<Below);
  97.                         delay_nms(200);
  98.                     }
  99.                      ClearLine(2);
  100.                     LCD_DisplayString(2,1,"Value MIN!");
  101.                 }
  102.                 else
  103.                 {
  104.                     PORTA |= (1<<Below);
  105.                     OcrReg -= STEP;
  106.                     OCR = OcrReg;
  107.                     ShowValue(OcrReg);
  108.                 }
  109.             }
  110.         }      
  111.     }
  112. }


  113. //比較中斷子程序,可以用來產生正弦波
  114. /*#pragma vector = TIMER1_COMPA_vect
  115.     __interrupt void CompA_isr( void )
  116. {
  117.    
  118.     OcrReg =  st[j];
  119.     OCR = OcrReg;  
  120.     j++;  
  121.     if(j>88)
  122.     {
  123.         j = 0;
  124.     }
  125. }*/
復制代碼

所有資料51hei提供下載:
PWM.rar (75.23 KB, 下載次數: 28)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕国产视频 | 欧美激情一区二区 | 日本三级在线视频 | 亚洲免费av一区 | 色爱综合网 | 国产精品久久久亚洲 | 91大片| 亚洲社区在线 | 在线免费观看毛片 | 日韩久久久久久 | 日本电影免费完整观看 | 欧美日韩国产中文 | 一区二区三区免费 | 国产精品视频免费播放 | www.日本精品| 波多野结衣先锋影音 | 日韩欧美在线免费观看 | 久久精品69 | 国产情侣久久 | 色黄网站| 国产精品久久久久久久免费大片 | 久久毛片 | 亚洲一区二区三区免费视频 | 精品成人佐山爱一区二区 | 日韩乱码一二三 | www.国产一区| 国产成人jvid在线播放 | wwwxx在线观看 | 中文字幕高清 | 亚洲欧美日韩中文字幕一区二区三区 | 成人综合视频在线 | 中文字幕综合在线 | 精品美女在线观看视频在线观看 | 精品视频一区二区三区在线观看 | 国产视频中文字幕在线观看 | 在线观看国产精品视频 | 久久午夜视频 | 一区二区三区国产 | 国产一区二区三区四区五区加勒比 | 国产精品久久久久久久久久免费 | 久久久久久成人 |