[LOOK] LOOK_ADC_PWM0

[复制链接]
 楼主| wang0225 发表于 2011-8-19 19:20 | 显示全部楼层 |阅读模式
ADC, PWM, ST, DCS, se
本帖最后由 wang0225 于 2011-8-19 19:54 编辑
  1. /*
  2. 这程序摆在我桌面好长时间啦,竟然忘记上传啦 !晕......
  3. 初始化设置:  时钟配置为 XTL12M_EN
  4.               CPU时钟频率为12MHz
  5.      外设时钟配置为PWM01_S : 外部 4~24MHz 晶振使能
  6.      外设时钟配置为PWM01_EN : 选上
  7.      外设时钟配置为ADC_S : 外部 4~24MHz 晶振使能
  8.      外设时钟配置为ADC_N : 3  
  9.      外设时钟配置为ADC_EN : 选上
  10.      PA.1选择多功能管脚选择ADC1,输入
  11.         PA.12选择多功能管脚选择PWM0,输出
  12.             
  13. 主要完成功能:产生400Hz的波形,刚开始的占空比会根据助学板上的电位器的情况而定。
  14.               旋转电位器可以改变PWM的占空比。
  15.      此程序就一个任务,比较简单!
  16.            最后还是要感谢大家对我的帮助!
  17. 上传日期:   2011/8/19
  18. */
  19. #include "LOOK_ADC_PWM.h"
  20. #define LOOK_H 1
  21. #if LOOK_H == 0
  22. #include "NUC1xx.h"
  23. #include "NUC1xxM051Seriescfg.h"
  24. #else
  25. #include <nuc120re3an.h>
  26. using namespace nuvoton;
  27. #endif

  28. // 任务类 task_LOOK_PWM_t 的例程
  29. void task_LOOK_ADC_PWM_t::routine()
  30. {
  31. // TODO: 在此编写 task_LOOK_PWM_t 例程的内容
  32. uint8_t PWM0_Duty_Cycle = 50;   //PWM初始化占空比为50
  33. #if LOOK_H == 0
  34. SYSs.IPRSTC2.Bits.ADC_RST = 1;
  35. SYSs.IPRSTC2.Bits.ADC_RST = 0;  /* Reset ADC */
  36. //ADC时钟、分频及配置为AD引脚在look中配置
  37. ADCs.ADCR.Bits.ADEN = 1;   //使能AD模块
  38. ADCs.ADCALR.Bits.CALEN = 1;   //自校正使能
  39. while(!ADCs.ADCALR.Bits.CALDONE); //等待自校正结束
  40. ADCs.ADCR.Bits.DIFFEN = 0;   //单端输入
  41. ADCs.ADCR.Bits.ADST = 0;   //停止AD
  42. ADCs.ADCR.Bits.ADMD = 0;   //单一转换
  43. ADCs.ADCHER.Bits.CHEN = 0x02;  //模拟输入通道1使能
  44. ADCs.ADSR.Bits.ADF = 1;    //清AD中断标志
  45. SYSCLKs.CLKSEL1.Bits.TMR0_S = 0b000; //外部12M晶振
  46. PWM0s.PCR.Bits.CH0INV = 0;    //反向关闭
  47. PWM0s.PCR.Bits.CH0MOD = 1;    //自动重载
  48. PWM0s.PPR.Bits.CP01 = 1;    //预分频  1
  49. PWM0s.CSR.Bits.CSR0 = 0b100;   //分频系数 1
  50. uint16_t u16Duty = 12000000/((1+1)*1*400);//PWM 频率 400HZ
  51. PWM0s.CNR0.Regs = u16Duty-1;     //PWM 频率 = PWMxy_CLK/(prescale+1)*(clock divider)/(CNR+1);
  52. PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1; //占空比 = (CMR+1)/(CNR+1).
  53. PWM0s.POE.Bits.PWM0 = 1;    //PWM0输出使能
  54. //PA.12作为PWM0   使用LOOK进行配置
  55. PWM0s.PCR.Bits.CH0EN = 1;    // 使能PWM功能
  56. while (true)
  57. {
  58.     // TODO: 在此编写 task_ad_t 例程的内容
  59.    ADCs.ADCR.Bits.ADST = 1; //启动AD
  60.    while(!ADCs.ADSR.Bits.ADF); //等待转换结束
  61.    ADCs.ADSR.Bits.ADF = 1;  //清AD中断标志
  62.    uint32_t AD_Result = ADCs.ADDR1.Regs&0xFFF;
  63.    PWM0_Duty_Cycle=AD_Result/50;   
  64.   // PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1;  //更新占空比
  65.    if (PWM0_Duty_Cycle!=0)
  66.     PWM0s.CMR0.Regs = u16Duty*PWM0_Duty_Cycle/100-1;  //更新占空比
  67.    else PWM0s.CMR0.Regs = 0;
  68. }
  69. #else
  70. SYS.IPRSTC2().ADC_RST = 1;
  71. SYS.IPRSTC2().ADC_RST = 0; // Reset ADC
  72. //ADC时钟、分频及配置为AD引脚在look中配置
  73. ADC.ADCR().ADEN = 1;   //使能AD模块
  74. ADC.ADCALR().CALEN = 1;   //自校正使能
  75. while(!ADC.ADCALR().CALDONE); //等待自校正结束
  76. ADC.ADCR()
  77.     .DIFFEN(0)   //单端输入
  78.     .ADST(0)   //停止AD
  79.     .ADMD(0);   //单一转换
  80. ADC.ADCHER().CHEN = 0x02;  //模拟输入通道1使能
  81. ADC.ADSR().ADF = 1;    //清AD中断标志
  82. SYSCLK.CLKSEL1().TMR0_S = tmrs_t::XTL12M; //外部12M晶振
  83. PWMA.PCR()
  84.        .CH0INV(0)    //反向关闭
  85.        .CH0MOD(1);    //自动重载
  86. PWMA.PPR().CP01 = 1;    //预分频  1
  87. PWMA.CSR().CSR0 = 0b100;   //分频系数 1
  88. uint16_t u16Duty = 12000000/((1+1)*1*400);//PWM 频率 400HZ
  89. PWMA.CNR0 = u16Duty-1;     //PWM 频率 = PWMxy_CLK/(prescale+1)*(clock divider)/(CNR+1);
  90. PWMA.CMR0 = u16Duty*PWM0_Duty_Cycle/100-1; //占空比 = (CMR+1)/(CNR+1).
  91. PWMA.POE().PWM0 = 1;    //PWM0输出使能
  92. //PA.12作为PWM0   使用LOOK进行配置
  93. PWMA.PCR().CH0EN = 1;    // 使能PWM功能
  94. while (true)
  95. {
  96.     // TODO: 在此编写 task_ad_t 例程的内容
  97.    ADC.ADCR().ADST = 1; //启动AD
  98.    while(!ADC.ADSR().ADF); //等待转换结束
  99.    ADC.ADSR().ADF = 1;  //清AD中断标志
  100.    uint32_t AD_Result = ADC.ADDR1&0xFFF;
  101.    PWM0_Duty_Cycle=AD_Result/50;
  102.   // PWMA.CMR0 = u16Duty*PWM0_Duty_Cycle/100-1;  //更新占空比
  103.    if (PWM0_Duty_Cycle!=0)
  104.      PWMA.CMR0 = u16Duty*PWM0_Duty_Cycle/100-1;  //更新占空比
  105.     else PWMA.CMR0 = 0;
  106. }
  107. #endif
  108. }

  109. #ifdef LOOK_SCHEDULING_PRIORITY
  110. instantiate::task<task_LOOK_ADC_PWM_t, LOOK_STACK_SIZE> task_LOOK_ADC_PWM(0);
  111. #else
  112. instantiate::task<task_LOOK_ADC_PWM_t, LOOK_STACK_SIZE> task_LOOK_ADC_PWM;
  113. #endif

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| wang0225 发表于 2011-8-19 19:55 | 显示全部楼层
本帖最后由 wang0225 于 2011-8-19 20:00 编辑

沙发自己做啦:)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| wang0225 发表于 2011-8-19 20:01 | 显示全部楼层
还有几张张片就不传啦,网速慢啊
 楼主| wang0225 发表于 2011-8-20 10:27 | 显示全部楼层
谢谢大叔给条裤子:P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

185

帖子

1

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

0

主题

185

帖子

1

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