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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11461|回復: 9
收起左側

ATmega2560單片機12路PWM輸出的程序 每路PWM可獨立控制

[復制鏈接]
ID:140725 發表于 2017-4-6 20:35 | 顯示全部樓層 |閱讀模式
PWM模塊設計說明:
使用ATmega2560單片機開發一個12路PWM輸出的程序,要求每路PWM可以獨立控制。通過串口指令控制某路PWM輸出某個頻率值(具體通道受指令第一字節控制),每路PWM的頻率范圍能在20-2000HZ范圍內變化(具體頻率值受指令第二字節控制),同時,還能夠隨時停止某路的輸出。
指令要求:
A1  XX   第一路PWM連續輸出占空比為50%不變的方波。
XX00時,停止輸出,為01~FF時,輸出20~2000HZ頻率值,其中重點關照1000HZ以下,以5HZ為步進;1000-2000HZ15HZ步進即可,以上要求的步進值并非十分嚴格,如果不易實現,可以稍微修改。)  
以下均相同要求:
A2  XX   第二路。。。。
A3  XX   第三路。。。。
...............
AC  XX   第十二路。。。。
初始上電時,各路均不輸出。

0.png

avr單片機源程序:
  1. #include "kernel.h"

  2. unsigned int PWM_Buf[6];//6路PWM頻率

  3. unsigned long timer0_ticks;
  4. unsigned long timer0_tickssec;
  5. unsigned long timer1_ticks;
  6. unsigned long timer1_ticksmin;
  7. unsigned long timer2_ticks;
  8. unsigned long timer2_tickssec;
  9. unsigned long timer3_ticks;
  10. unsigned long timer3_ticksmin;
  11. unsigned long timer4_ticks;
  12. unsigned long timer4_ticksmin;
  13. unsigned long timer5_ticks;
  14. unsigned long timer5_ticksmin;

  15. void Timer0_Init(void)
  16. {
  17.     timer0_ticks = 0;
  18.     timer0_tickssec = 0;

  19.     TCCR0A = 0x00;
  20.     TCCR0B = 0x00;
  21.     TCNT0 = 0x00;
  22.     OCR0A = F_CPU/(1024-1)/20;//頻率F_PWM
  23.     OCR0B = OCR0A/2;//占空比50%
  24.     //TCCR0A = 0xA3;  //COM0A1 COM0A0 COM0B1 COM0B0 – – WGM01 WGM00
  25.     TCCR0B = 0xCD;  //FOC0A FOC0B – – WGM02 CS02 CS01 CS00
  26.     /*
  27.     TCCR0A = 0x00;
  28.     TCCR0B = 0x00;//stop
  29.     TCNT0  = 0xE7;//25us
  30.     OCR0A  = 0x18;
  31.     OCR0B  = 0x18;
  32.     TCCR0A = 0x03;
  33.     TCCR0B = 0x02;//start,clkT0S/8
  34.     TIMSK0|= 0x01;//enable 0verflow interrupt*/
  35. }

  36. void TC0_Set_PWM(unsigned int curF)
  37. {//20~80為clkT0S/1024,80~300為clkT0S/256,300~2000為clkT0S/64
  38.     if(curF==0)
  39.     {
  40.         OCR0A = 0;
  41.         OCR0B = 0;
  42.         TCCR0A = 0;
  43.     }
  44.     else if((curF>=20)&&(curF<80))
  45.     {
  46.         OCR0A = F_CPU/(1024-1)/curF;
  47.         OCR0B = OCR0A/2;
  48.         TCCR0A = 0xA3;
  49.         TCCR0B = 0xCD;
  50.     }
  51.     else if((curF>=80)&&(curF<300))
  52.     {
  53.         OCR0A = F_CPU/(256-1)/curF;
  54.         OCR0B = OCR0A/2;
  55.         TCCR0A = 0xA3;
  56.         TCCR0B = 0xCC;
  57.     }
  58.     else if((curF>=300)&&(curF<=2000))
  59.     {
  60.         OCR0A = F_CPU/(64-1)/curF;
  61.         OCR0B = OCR0A/2;
  62.         TCCR0A = 0xA3;
  63.         TCCR0B = 0xCB;
  64.     }
  65. }

  66. void Timer1_Init(void)
  67. {
  68.     unsigned int temp;

  69.     timer1_ticks = 0;
  70.     timer1_ticksmin = 0;

  71.     TCCR1A = 0x00;
  72.     TCCR1B = 0x00;
  73.     TCCR1C = 0x00;
  74.     TCNT1H = 0x00;
  75.     TCNT1L = 0x00;
  76.     temp = F_CPU/16/20;
  77.     OCR1A=temp;
  78.     //temp = temp/2;
  79.     //OCR1B=temp;
  80.     //OCR1C=temp;
  81.     //TCCR1A=(0<<COM1A1)|(1<<COM1A0)|/*(1<<COM1B1)|(0<<COM1B0)|(1<<COM1C1)|(0<<COM1C0)|*/(1<<WGM11)|(1<<WGM10);
  82.     TCCR1B=(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)/*|(1<<CS10)*/;
  83.     /*
  84.     TCCR1A = 0x00;//COM1A1 COM1A0 COM1B1 COM1B0 COM1C1 COM1C0 WGM11 WGM10
  85.     TCCR1B = 0x00;//stop,ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10
  86.     TCCR1C = 0x00;//FOC1A FOC1B FOC1C – – – – –
  87.     TCNT1H = 0xE3;
  88.     TCNT1L = 0xE0;
  89.     OCR1AH = 0x1C;
  90.     OCR1AL = 0x1F;
  91.     OCR1BH = 0x1C;
  92.     OCR1BL = 0x1F;
  93.     OCR1CH = 0x1C;
  94.     OCR1CL = 0x1F;
  95.     ICR1H  = 0x00;
  96.     ICR1L  = 0x00;
  97.     TCCR1B = 0x05;
  98. //    TIMSK |= 0x04;//enable 0verflow interrupt*/
  99. }

  100. void TC1_Set_PWM(unsigned int curF)
  101. {
  102.     unsigned int temp;

  103.     if(curF==0)
  104.     {
  105.         //OCR1A = 0;
  106.         //OCR1B = 0;
  107.         TCCR1A=0;
  108.     }
  109.     else if((curF>=20)&&(curF<=2000))
  110.     {
  111.         temp = F_CPU/16/curF;
  112.         OCR1A=temp;
  113.         TCCR1A=(0<<COM1A1)|(1<<COM1A0)|/*(1<<COM1B1)|(0<<COM1B0)|(1<<COM1C1)|(0<<COM1C0)|*/(1<<WGM11)|(1<<WGM10);
  114.     }
  115. }

  116. void Timer2_Init(void)
  117. {
  118.     timer2_ticks = 0;
  119.     timer2_tickssec = 0;

  120.     TCCR2A = 0x00;
  121.     TCCR2B = 0x00;
  122.     TCNT2 = 0x00;
  123.     OCR2A = F_CPU/(1024-1)/20;//頻率F_PWM
  124.     OCR2B = OCR2A/2;//占空比50%
  125.     //TCCR2A = 0xA3;  //COM2A1 COM2A0 COM2B1 COM2B0 – – WGM21 WGM20
  126.     TCCR2B = 0xCF;  //FOC2A FOC2B – – WGM22 CS22 CS21 CS20

  127. //    TCCR2 = 0x00;//stop,FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20
  128. //    TCNT2 = 0xB8;//set count 10ms
  129. //    OCR2  = 0x47;
  130. //    TCCR2 = 0x05;//start,clkT0S/1024
  131. //    TIMSK|= 0x40;//enable 0verflow interrupt
  132. }

  133. void TC2_Set_PWM(unsigned int curF)
  134. {//20~80為clkT0S/1024,80~300為clkT0S/256,300~2000為clkT0S/64
  135.     if(curF==0)
  136.     {
  137.         OCR2A = 0;
  138.         OCR2B = 0;
  139.         TCCR2A = 0;
  140.     }
  141.     else if((curF>=20)&&(curF<80))
  142.     {
  143.         OCR2A = F_CPU/(1024-1)/curF;
  144.         OCR2B = OCR2A/2;
  145.         TCCR2A = 0xA3;
  146.         TCCR2B = 0xCF;
  147.     }
  148.     else if((curF>=80)&&(curF<300))
  149.     {
  150.         OCR2A = F_CPU/(256-1)/curF;
  151.         OCR2B = OCR2A/2;
  152.         TCCR2A = 0xA3;
  153.         TCCR2B = 0xCE;
  154.     }
  155.     else if((curF>=300)&&(curF<=2000))
  156.     {
  157.         OCR2A = F_CPU/(64-1)/curF;
  158.         OCR2B = OCR2A/2;
  159.         TCCR2A = 0xA3;
  160.         TCCR2B = 0xCC;
  161.     }
  162. }

  163. void Timer3_Init(void)
  164. {
  165.     unsigned int temp;

  166.     timer3_ticks = 0;
  167.     timer3_ticksmin = 0;

  168.     TCCR3A = 0x00;
  169.     TCCR3B = 0x00;
  170.     TCCR3C = 0x00;
  171.     TCNT3H = 0x00;
  172.     TCNT3L = 0x00;
  173.     temp = F_CPU/16/20;
  174.     OCR3A=temp;
  175.     //temp = temp/2;
  176.     //OCR3B=temp;
  177.     //OCR3C=temp;
  178.     //TCCR3A=(0<<COM3A1)|(1<<COM3A0)|/*(1<<COM3B1)|(0<<COM3B0)|(1<<COM3C1)|(0<<COM3C0)|*/(1<<WGM31)|(1<<WGM30);
  179.     TCCR3B=(1<<WGM33)|(1<<WGM32)|(0<<CS32)|(1<<CS31)/*|(1<<CS30)*/;
  180.     /*
  181.     TCCR3A = 0x00;//COM3A1 COM3A0 COM3B1 COM3B0 COM3C1 COM3C0 WGM31 WGM30
  182.     TCCR3B = 0x00;//stop,ICNC3 ICES3 – WGM33 WGM32 CS32 CS31 CS30
  183.     TCCR3C = 0x00;//FOC3A FOC3B FOC3C – – – – –
  184.     TCNT3H = 0xE3;
  185.     TCNT3L = 0xE0;//set count 1s
  186.     OCR3AH = 0x1C;
  187.     OCR3AL = 0x1F;
  188.     OCR3BH = 0x1C;
  189.     OCR3BL = 0x1F;
  190.     OCR3CH = 0x1C;
  191.     OCR3CL = 0x1F;
  192.     ICR3H  = 0x00;
  193.     ICR3L  = 0x00;
  194.     TCCR3B = 0x05;//start,clkT0S/1024
  195. //    ETIMSK|= 0x04;//enable 0verflow interrupt*/
  196. }

  197. void TC3_Set_PWM(unsigned int curF)
  198. {
  199.     unsigned int temp;

  200.     if(curF==0)
  201.     {
  202.         //OCR3A = 0;
  203.         //OCR3B = 0;
  204.         TCCR3A=0;
  205.     }
  206.     else if((curF>=20)&&(curF<=2000))
  207.     {
  208.         temp = F_CPU/16/curF;
  209.         OCR3A=temp;
  210.         TCCR3A=(0<<COM3A1)|(1<<COM3A0)|/*(1<<COM3B1)|(0<<COM3B0)|(1<<COM3C1)|(0<<COM3C0)|*/(1<<WGM31)|(1<<WGM30);
  211.     }
  212. }

  213. void Timer4_Init(void)
  214. {
  215.     unsigned int temp;

  216.     timer4_ticks = 0;
  217.     timer4_ticksmin = 0;

  218.     TCCR4A = 0x00;
  219.     TCCR4B = 0x00;
  220.     TCCR4C = 0x00;
  221.     TCNT4H = 0x00;
  222.     TCNT4L = 0x00;
  223.     temp = F_CPU/16/20;
  224.     OCR4A=temp;
  225.     //temp = temp/2;
  226.     //OCR4B=temp;
  227.     //OCR4C=temp;
  228.     //TCCR4A=(0<<COM4A1)|(1<<COM4A0)|/*(1<<COM4B1)|(0<<COM4B0)|(1<<COM4C1)|(0<<COM4C0)|*/(1<<WGM41)|(1<<WGM40);
  229.     TCCR4B=(1<<WGM43)|(1<<WGM42)|(0<<CS42)|(1<<CS41)/*|(1<<CS40)*/;
  230. }

  231. void TC4_Set_PWM(unsigned int curF)
  232. {
  233.     unsigned int temp;

  234.     if(curF==0)
  235.     {
  236.         //OCR4A = 0;
  237.         //OCR4B = 0;
  238.         TCCR4A=0;
  239.     }
  240.     else if((curF>=20)&&(curF<=2000))
  241.     {
  242.         temp = F_CPU/16/curF;
  243.         OCR4A=temp;
  244.         TCCR4A=(0<<COM4A1)|(1<<COM4A0)|/*(1<<COM4B1)|(0<<COM4B0)|(1<<COM4C1)|(0<<COM4C0)|*/(1<<WGM41)|(1<<WGM40);
  245.     }
  246. }

  247. void Timer5_Init(void)
  248. {
  249.     unsigned int temp;

  250.     timer5_ticks = 0;
  251.     timer5_ticksmin = 0;

  252.     TCCR5A = 0x00;
  253.     TCCR5B = 0x00;
  254.     TCCR5C = 0x00;
  255.     TCNT5H = 0x00;
  256.     TCNT5L = 0x00;
  257.     temp = F_CPU/16/20;
  258.     OCR5A=temp;
  259.     //temp = temp/2;
  260.     //OCR5B=temp;
  261.     //OCR5C=temp;
  262.     //TCCR5A=(0<<COM5A1)|(1<<COM5A0)|/*(1<<COM5B1)|(0<<COM5B0)|(1<<COM5C1)|(0<<COM5C0)|*/(1<<WGM51)|(1<<WGM50);
  263.     TCCR5B=(1<<WGM53)|(1<<WGM52)|(0<<CS52)|(1<<CS51)/*|(1<<CS50)*/;
  264. }

  265. void TC5_Set_PWM(unsigned int curF)
  266. {
  267.     unsigned int temp;

  268.     if(curF==0)
  269.     {
  270.         //OCR5A = 0;
  271.         //OCR5B = 0;
  272.         TCCR5A=0;
  273.     }
  274.     else if((curF>=20)&&(curF<=2000))
  275.     {
  276.         temp = F_CPU/16/curF;
  277.         OCR5A=temp;
  278.         TCCR5A=(0<<COM5A1)|(1<<COM5A0)|/*(1<<COM5B1)|(0<<COM5B0)|(1<<COM5C1)|(0<<COM5C0)|*/(1<<WGM51)|(1<<WGM50);
  279.     }
  280. }

  281. /*******************************************************************************
  282. * Function Name  : TIMER0_OVF_vectFunc
  283. * Description    : 定時器0溢出中斷程序
  284. * Input          : None
  285. * Output         : None
  286. * Return         : None
  287. *******************************************************************************/
  288. #pragma vector = TIMER0_OVF_vect
  289. __interrupt void TIMER0_OVF_vectFunc(void)
  290. {

  291. }

  292. /*******************************************************************************
  293. * Function Name  : TIMER1_OVF_vectFunc
  294. * Description    : 定時器1溢出中斷程序
  295. * Input          : None
  296. * Output         : None
  297. * Return         : None
  298. *******************************************************************************/
  299. #pragma vector = TIMER1_OVF_vect
  300. __interrupt void TIMER1_OVF_vectFunc(void)
  301. {

  302. }

  303. /*******************************************************************************
  304. * Function Name  : TIMER2_OVF_vectFunc
  305. * Description    : 定時器2溢出中斷程序
  306. * Input          : None
  307. * Output         : None
  308. * Return         : None
  309. *******************************************************************************/
  310. #pragma vector = TIMER2_OVF_vect
  311. __interrupt void TIMER2_OVF_vectFunc(void)
  312. {

  313. }

  314. /*******************************************************************************
  315. * Function Name  : TIMER3_OVF_vectFunc
  316. * Description    : 定時器3溢出中斷程序
  317. * Input          : None
  318. * Output         : None
  319. * Return         : None
  320. *******************************************************************************/
  321. #pragma vector = TIMER3_OVF_vect
  322. __interrupt void TIMER3_OVF_vectFunc(void)
  323. {

  324. }
復制代碼

完整源碼下載:
ATMEGA2560-PWM USART.zip (96.7 KB, 下載次數: 112)
回復

使用道具 舉報

ID:76408 發表于 2018-3-8 17:01 | 顯示全部樓層
好東西我下載了,謝謝樓主。
回復

使用道具 舉報

ID:154092 發表于 2018-3-25 09:23 | 顯示全部樓層
太好了  感謝分享
回復

使用道具 舉報

ID:80372 發表于 2018-5-18 15:25 | 顯示全部樓層
好東西我下載了,謝謝樓主。
回復

使用道具 舉報

ID:25103 發表于 2018-6-22 22:59 | 顯示全部樓層
好東西我下載了,謝謝樓主。
回復

使用道具 舉報

ID:388738 發表于 2018-8-22 12:41 | 顯示全部樓層
太好了  感謝分享
回復

使用道具 舉報

ID:222998 發表于 2018-10-17 10:03 | 顯示全部樓層
謝樓主   學習  66666666666666
回復

使用道具 舉報

ID:25103 發表于 2018-10-21 18:08 | 顯示全部樓層
太好了  感謝分享
回復

使用道具 舉報

ID:94309 發表于 2019-1-17 08:52 | 顯示全部樓層
12個電機好做,15個pwm都做難,有可能嗎?
回復

使用道具 舉報

ID:66915 發表于 2019-11-27 17:15 | 顯示全部樓層
好東西我下載了,謝謝樓主。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品区 | 亚洲精品456 | 国产成人福利在线观看 | 断背山在线观看 | 久久久久久高清 | 毛片网站在线观看 | 欧美成视频 | 国产一级免费在线观看 | 亚洲欧美激情精品一区二区 | 精品国产31久久久久久 | 51ⅴ精品国产91久久久久久 | 三级免费 | 免费黄色av| 日韩一区在线播放 | av网址在线 | 国产欧美精品区一区二区三区 | 欧美成视频在线观看 | 欧美午夜视频 | 亚洲一av| 日本精品视频 | 一区二区三区精品视频 | 日韩午夜在线观看 | 九色在线视频 | 久久综合亚洲 | 亚洲成人av| 一区二区三区欧美在线 | 亚洲国产精久久久久久久 | 九九九久久国产免费 | 亚洲精品视频在线看 | 欧美一级在线观看 | 91综合在线观看 | 国产精品视频一区二区三区 | 欧美性video| 中文字幕三区 | 国产一区二区三区 | 日韩av一区二区在线观看 | 成人精品国产一区二区4080 | 欧美一区二区三区国产精品 | 欧美精品一二三 | 亚洲一区欧美 | 99re99|