[DemoCode下载] mini51控制DC风扇速度

[复制链接]
248|11
 楼主 | 2019-1-12 23:50 | 显示全部楼层

  1. /******************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 3 $
  5. * $Date: 13/10/07 3:54p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    PWM sample for Mini51 series MCU
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/  
  11. #include <stdio.h>
  12. #include "Mini51Series.h"




  13. void SYS_Init(void)
  14. {
  15. /*---------------------------------------------------------------------------------------------------------*/
  16. /* Init System Clock                                                                                       */
  17. /*---------------------------------------------------------------------------------------------------------*/

  18.     /* Unlock protected registers */
  19.     while(SYS->RegLockAddr != 1) {
  20.         SYS->RegLockAddr = 0x59;
  21.         SYS->RegLockAddr = 0x16;
  22.         SYS->RegLockAddr = 0x88;
  23.     }

  24.     /* Enable external 12MHz XTAL, internal 22.1184MHz */
  25.     CLK->PWRCON = CLK_PWRCON_IRC22M_EN_Msk;

  26.     /* Waiting for clock ready */
  27.     while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_IRC22M_STB_Msk));

  28.     /* Enable IP clock */
  29.     CLK->APBCLK = CLK_APBCLK_UART_EN_Msk | CLK_APBCLK_PWM23_EN_Msk;

  30.     /* Update System Core Clock */
  31.     /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock and CycylesPerUs automatically. */
  32.     SystemCoreClockUpdate();


  33. /*---------------------------------------------------------------------------------------------------------*/
  34. /* Init I/O Multi-function                                                                                 */
  35. /*---------------------------------------------------------------------------------------------------------*/
  36.     /* Set P1 multi-function pins for UART RXD, TXD */
  37.     SYS->P0_MFP = SYS_MFP_P00_TXD | SYS_MFP_P01_RXD;

  38.     /* Set P2 multi-function pins for PWM Channel */
  39.     SYS->P2_MFP = SYS_MFP_P24_PWM2;


  40.     /* Lock protected registers */
  41.     SYS->RegLockAddr = 0;
  42. }

  43. void UART_Init(void)
  44. {
  45.     // Set UART to 8 bit character length, 1 stop bit, and no parity
  46.     UART->LCR = UART_LCR_WLS_Msk;       
  47.     // 22.1184 MHz reference clock input, for 115200 bps
  48.     // 22118400 / 115200 = 192. Using mode 2 to calculate baudrate, 192 - 2 = 190 = 0xBE
  49.     UART->BAUD = UART_BAUD_DIV_X_EN_Msk | UART_BAUD_DIV_X_ONE_Msk | (0xBE);          
  50. }

  51. int32_t main (void)
  52. {
  53.     /* Init System, IP clock and multi-function I/O
  54.        In the end of SYS_Init() will issue SYS_LockReg()
  55.        to lock protected register. If user want to write
  56.        protected register, please issue SYS_UnlockReg()
  57.        to unlock protected register if necessary */
  58.     SYS_Init();

  59.     /* Init UART to 115200-8n1 for print message */
  60.     UART_Init();

  61.     printf("\nThis sample code will output PWM channel 0 to output waveform\n");
  62.     printf("using double buffer feature.\n");
  63.         
  64.     /*
  65.         PWM channel 0 wave form of this sample showns below:

  66.         |<-        CNR + 1  clk     ->|  CNR + 1 = 199 + 1 CLKs  
  67.                        |<-CMR+1 clk ->|  CMR + 1 = 99 + 1 CLKs
  68.                                       |<-   CNR + 1  ->|  CNR + 1 = 99 + 1 CLKs   
  69.                                                |<CMR+1>|  CMR + 1 = 39 + 1 CLKs
  70.          ______________                ________         _____
  71.       __|      100     |_____100______|  60    |__40___|     PWM waveform
  72.       
  73.     */

  74.    

  75.     // Set channel 0 perscaler to 2. Actual value fill into register needs to minus 1.
  76.     PWM->PPR = 0x0100;
  77.     // Set channel 0 clock divider to 1
  78.     PWM->CSR = PWM_CLK_DIV_1 << PWM_CSR_CSR2_Pos;
  79.     // Enable PWM channel 0 auto-reload mode
  80.     PWM->PCR = PWM_PCR_CH2MOD_Msk;
  81.     /*
  82.       Configure PWM channel 1 init period and duty.
  83.       Period is HCLK / (perscaler * clock divider * (CNR + 1))
  84.       Duty ratio = (CMR + 1) / (CNR + 1)
  85.       Period = 22.1184 MHz / (1 * 1 * (1B9 + 1)) =  25000 Hz
  86.       Duty ratio = (99 + 1) / (199 + 1) = 50%
  87.     */
  88.     PWM->CMR[2] = 0xB9;
  89.     PWM->CNR[2] = 0x1B9;   

  90.    
  91.     // Enable PWM channel 2 output
  92.     PWM->POE = PWM_POE_PWM2_Msk;
  93.    
  94.     // Start
  95.     PWM->PCR |= PWM_PCR_CH2EN_Msk;
  96.    
  97.     while(1);

  98. }

  99. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/


复制代码

使用特权

评论回复
 楼主 | 2019-1-12 23:50 | 显示全部楼层
The fan speed is captured by Timer0 Capture, and then adjusted through PWM2.

使用特权

评论回复
| 2019-1-13 11:46 | 显示全部楼层
果然是PWM,我猜就是。

使用特权

评论回复
| 2019-1-14 18:13 | 显示全部楼层
控制风扇666

使用特权

评论回复
| 2019-1-16 23:55 | 显示全部楼层
希望我能看的懂。

使用特权

评论回复
| 2019-1-17 09:36 | 显示全部楼层
DC风扇的速度是不是也是这么控制。

使用特权

评论回复
| 2019-1-18 23:41 | 显示全部楼层
PWM的典型应用参考。

使用特权

评论回复
| 2019-1-18 23:41 | 显示全部楼层
PWM貌似在很多控制领域有用。

使用特权

评论回复
| 2019-1-19 23:36 | 显示全部楼层
有没有电路参考?

使用特权

评论回复
| 2019-1-21 23:50 | 显示全部楼层
如果这些方案有原理图等,就好了。

使用特权

评论回复
| 2019-1-21 23:51 | 显示全部楼层
毕竟像我这种电路学的不好的人还是很多的。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表