找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4661|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)C語(yǔ)言程序怎么控制開(kāi)機(jī)PWM緩慢啟動(dòng),從1%-100%遞增,關(guān)機(jī)時(shí)從100%-%1遞減

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:468169 發(fā)表于 2022-12-12 22:11 來(lái)自手機(jī) | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
50黑幣
開(kāi)機(jī)PWM緩慢啟動(dòng),從1%-100%遞增,關(guān)機(jī)時(shí)從100%-%1遞減,C程序怎么控制PWM,有類似程序么?求指導(dǎo)思路

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

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2022-12-12 23:11 | 只看該作者
呼吸燈,了解一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:268736 發(fā)表于 2022-12-13 06:09 | 只看該作者
用你哪一顆MCU? 51? PIC? MSP430?  找到呼吸燈的範(fàn)例研究研究會(huì)明白的 !
回復(fù)

使用道具 舉報(bào)

地板
ID:468169 發(fā)表于 2022-12-13 07:43 來(lái)自手機(jī) | 只看該作者
akii 發(fā)表于 2022-12-13 06:09
用你哪一顆MCU? 51? PIC? MSP430?  找到呼吸燈的範(fàn)例研究研究會(huì)明白的 !

打算用STC8G
回復(fù)

使用道具 舉報(bào)

5#
ID:155507 發(fā)表于 2022-12-13 08:32 | 只看該作者
我給你來(lái)個(gè)晶宏官網(wǎng)程序試試


  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define CYCLE       0x1000

  4. sfr     P_SW2   =   0xba;

  5. sfr     PWMSET      =   0xF1;
  6. sfr     PWMCFG01    =   0xF6;
  7. sfr     PWMCFG23    =   0xF7;
  8. sfr     PWMCFG45    =   0xFE;

  9. #define PWM0C       (*(unsigned int  volatile xdata *)0xFF00)
  10. #define PWM0CH      (*(unsigned char volatile xdata *)0xFF00)
  11. #define PWM0CL      (*(unsigned char volatile xdata *)0xFF01)
  12. #define PWM0CKS     (*(unsigned char volatile xdata *)0xFF02)
  13. #define PWM0TADC    (*(unsigned int  volatile xdata *)0xFF03)
  14. #define PWM0TADCH   (*(unsigned char volatile xdata *)0xFF03)
  15. #define PWM0TADCL   (*(unsigned char volatile xdata *)0xFF04)
  16. #define PWM0IF      (*(unsigned char volatile xdata *)0xFF05)
  17. #define PWM0FDCR    (*(unsigned char volatile xdata *)0xFF06)
  18. #define PWM00T1     (*(unsigned int  volatile xdata *)0xFF10)
  19. #define PWM00T1H    (*(unsigned char volatile xdata *)0xFF10)
  20. #define PWM00T1L    (*(unsigned char volatile xdata *)0xFF11)
  21. #define PWM00T2H    (*(unsigned char volatile xdata *)0xFF12)
  22. #define PWM00T2     (*(unsigned int  volatile xdata *)0xFF12)
  23. #define PWM00T2L    (*(unsigned char volatile xdata *)0xFF13)
  24. #define PWM00CR     (*(unsigned char volatile xdata *)0xFF14)
  25. #define PWM00HLD    (*(unsigned char volatile xdata *)0xFF15)

  26. sfr     P0M1    =   0x93;
  27. sfr     P0M0    =   0x94;
  28. sfr     P1M1    =   0x91;
  29. sfr     P1M0    =   0x92;
  30. sfr     P2M1    =   0x95;
  31. sfr     P2M0    =   0x96;
  32. sfr     P3M1    =   0xb1;
  33. sfr     P3M0    =   0xb2;
  34. sfr     P4M1    =   0xb3;
  35. sfr     P4M0    =   0xb4;
  36. sfr     P5M1    =   0xc9;
  37. sfr     P5M0    =   0xca;

  38. void PWM0_Isr() interrupt 22
  39. {
  40.     static bit dir = 1;
  41.     static int val = 0;

  42.     if (PWMCFG01 & 0x08)
  43.     {
  44.         PWMCFG01 &= ~0x08;                      //清中斷標(biāo)志
  45.         if (dir)
  46.         {
  47.             val++;
  48.             if (val >= CYCLE) dir = 0;
  49.         }
  50.         else
  51.         {
  52.             val--;
  53.             if (val <= 1) dir = 1;
  54.         }
  55.         _push_(P_SW2);
  56.         P_SW2 |= 0x80;
  57.         PWM00T2 = val;
  58.         _pop_(P_SW2);
  59.     }
  60. }

  61. void main()
  62. {
  63.     P0M0 = 0x00;
  64.     P0M1 = 0x00;
  65.     P1M0 = 0x00;
  66.     P1M1 = 0x00;
  67.     P2M0 = 0x00;
  68.     P2M1 = 0x00;
  69.     P3M0 = 0x00;
  70.     P3M1 = 0x00;
  71.     P4M0 = 0x00;
  72.     P4M1 = 0x00;
  73.     P5M0 = 0x00;
  74.     P5M1 = 0x00;

  75.     PWMSET = 0x01;                              //使能PWM0模塊(必須先使能模塊后面的設(shè)置才有效)

  76.     P_SW2 = 0x80;
  77.     PWM0CKS = 0x00;                             // PWM0時(shí)鐘為系統(tǒng)時(shí)鐘
  78.     PWM0C = CYCLE;                              //設(shè)置PWM0周期
  79.     PWM00T1= 0x0000;
  80.     PWM00T2= 0x0001;
  81.     PWM00CR= 0x80;                              //使能PWM00輸出
  82.     P_SW2 = 0x00;

  83.     PWMCFG01 = 0x05;                            //啟動(dòng)PWM0模塊并使能PWM0中斷
  84.     EA = 1;

  85.     while (1);
  86. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2022-12-13 09:32 | 只看該作者
給你一個(gè)漸亮漸暗開(kāi)關(guān)燈的示例,相關(guān)變量和端口根據(jù)實(shí)際需要自行調(diào)整。

  1. #include <reg51.H>

  2. sbit OUT=P1^0;
  3. sbit key=P3^4;

  4. unsigned char num;
  5. unsigned char count;
  6. bit sign;

  7. void delay_10ms()//延時(shí)函數(shù)
  8. {
  9.         int i,j;
  10.         for(i=0;i<10;i++)
  11.                 for(j=0;j<120;j++);
  12. }
  13. void Timer0Init()                //200微秒@12.000MHz
  14. {
  15.         TMOD= 0x02;                //設(shè)置定時(shí)器模式
  16.         TL0 = 0x38;                //設(shè)置定時(shí)初始值
  17.         TH0 = 0x38;                //設(shè)置定時(shí)重載值
  18.         TF0 = 0;                //清除TF0標(biāo)志
  19.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  20.         EA = 1;
  21.         ET0 = 1;
  22. }

  23. void main(void)
  24. {
  25.         Timer0Init();
  26.         while(1)
  27.         {
  28.                 if(!key)
  29.                 {
  30.                         delay_10ms();
  31.                         if(!key)
  32.                         {
  33.                                 sign=~sign;
  34.                                 while(!key);
  35.                         }
  36.                 }
  37.         }
  38. }

  39. void Timer0Interrupt(void) interrupt 1
  40. {
  41.         count++;
  42.         if(count>=100)
  43.         {
  44.                 count=0;
  45.                 if(sign)
  46.                 {
  47.                         if(num<100)num++;
  48.                 }
  49.                 else
  50.                 {
  51.                         if(num>0)num--;
  52.                 }
  53.         }
  54.         if(num>count)OUT=0;//暗
  55.         else OUT=1;//亮
  56. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

7#
ID:77589 發(fā)表于 2022-12-13 10:27 | 只看該作者
通過(guò)延時(shí)程序,延時(shí)增加或減小PWM輸出值,延時(shí)時(shí)長(zhǎng)就是步進(jìn)時(shí)長(zhǎng)。
回復(fù)

使用道具 舉報(bào)

8#
ID:1034262 發(fā)表于 2022-12-13 11:06 | 只看該作者
按一定的節(jié)拍,加減PWM值即可,STC官網(wǎng)有例子的。
回復(fù)

使用道具 舉報(bào)

9#
ID:468169 發(fā)表于 2022-12-15 20:37 來(lái)自手機(jī) | 只看該作者
wulin 發(fā)表于 2022-12-13 09:32
給你一個(gè)漸亮漸暗開(kāi)關(guān)燈的示例,相關(guān)變量和端口根據(jù)實(shí)際需要自行調(diào)整。

那如果開(kāi)機(jī)時(shí)要求7秒鐘內(nèi)完成占空比0%-100%的亮度,是不是設(shè)置一個(gè)變量控制占空比的速度時(shí)間呢?
回復(fù)

使用道具 舉報(bào)

10#
ID:824490 發(fā)表于 2022-12-15 21:28 | 只看該作者
想不通,真的想不通!都會(huì)PWM輸出了,還不會(huì)漸進(jìn)漸出?
回復(fù)

使用道具 舉報(bào)

11#
ID:213173 發(fā)表于 2022-12-15 21:42 | 只看該作者
nanyexin 發(fā)表于 2022-12-15 20:37
那如果開(kāi)機(jī)時(shí)要求7秒鐘內(nèi)完成占空比0%-100%的亮度,是不是設(shè)置一個(gè)變量控制占空比的速度時(shí)間呢?

延長(zhǎng)定時(shí)器中斷周期即可
回復(fù)

使用道具 舉報(bào)

12#
ID:161164 發(fā)表于 2022-12-16 09:12 | 只看該作者
nanyexin 發(fā)表于 2022-12-15 20:37
那如果開(kāi)機(jī)時(shí)要求7秒鐘內(nèi)完成占空比0%-100%的亮度,是不是設(shè)置一個(gè)變量控制占空比的速度時(shí)間呢?

7/100 = 0.07s = 70ms
弄一個(gè)70ms的標(biāo)志位
開(kāi)機(jī)時(shí)每70ms加1%
關(guān)機(jī)時(shí)每70ms減1%
回復(fù)

使用道具 舉報(bào)

13#
ID:645225 發(fā)表于 2023-2-5 13:49 | 只看該作者
在單片機(jī)C語(yǔ)言程序中控制PWM緩慢啟動(dòng)和關(guān)閉,您可以使用循環(huán)和延時(shí)函數(shù)來(lái)實(shí)現(xiàn)。

例如,在啟動(dòng)PWM時(shí),您可以使用以下代碼:
  1. #include <stdio.h>
  2. #include <unistd.h>

  3. void start_pwm(void)
  4. {
  5.     int i;
  6.     for (i = 1; i <= 100; i++) {
  7.         // 設(shè)置PWM占空比,例如:pwm_set_duty(i);
  8.         // 延時(shí)一定時(shí)間,例如:usleep(10000); // 延時(shí)10ms
  9.     }
  10. }
復(fù)制代碼

在關(guān)閉PWM時(shí),您可以使用以下代碼:
  1. void stop_pwm(void)
  2. {
  3.     int i;
  4.     for (i = 100; i >= 1; i--) {
  5.         // 設(shè)置PWM占空比,例如:pwm_set_duty(i);
  6.         // 延時(shí)一定時(shí)間,例如:usleep(10000); // 延時(shí)10ms
  7.     }
  8. }
復(fù)制代碼


請(qǐng)注意,上面的代碼是一個(gè)簡(jiǎn)單的示例,可能需要根據(jù)您的實(shí)際需求和硬件平臺(tái)進(jìn)行修改。此外,請(qǐng)?zhí)鎿Qpwm_set_duty函數(shù)為您的單片機(jī)上的PWM設(shè)置占空比函數(shù),以便正確設(shè)置PWM占空比。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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