[资料分享与下载] 以YL-KL26Z为平台研制数字电路实验平台(3)

[复制链接]
830|3
 楼主| C洛达尔多 发表于 2015-10-25 20:49 | 显示全部楼层 |阅读模式
当然,为了便于调整频率,最好是添加数码显示功能。至于手动脉冲功能,可通过GPIO中的键入程序来改造,每按一次键就产生一个由高到底的电平跳变。
此外,用示例程序Demo_LETMR_Interrupt也可以改造成,方法是用mkl_lptmr.c中的LPTMR0_CMR作为脉冲频率的调整变量。
  1. void  lptmrInit (void)
  2. {
  3.     SIM_SCGC5 |= SIM_SCGC5_LPTMR_MASK;       /*打开lptmr时钟    */
  4.     LPTMR0_CSR |= LPTMR_CSR_TCF_MASK | LPTMR_CSR_TIE_MASK;               /* 清除标志位 开启中断        */
  5.     LPTMR0_PSR |= LPTMR_PSR_PCS(1);             /* 使用1KHz时钟源 */
  6.     LPTMR0_CMR = n;                              /* 默认2分频 n=500即为1s */
  7.     LPTMR0_CSR |= LPTMR_CSR_TEN_MASK;         /* 开启LPTMR     */
  8. }

n=500时,输出频率=1KHz时钟源/2分频*500=1hz
n=5000时,输出频率=0.1 hz;
n=5时,输出频率=100 hz
5.译码器功能,它是视输入的情况,按照已规定好的对应关系来确定输出对应值。
以3-8译码器74HC138为例,它有3个输入端ABC8个输出端Y0~Y7

 楼主| C洛达尔多 发表于 2015-10-25 20:50 | 显示全部楼层
其程序结构如下:
  1. void ledSet()
  2. {
  3. INT8U ucMode;
  4.     // 令Y0~Y7皆为“1”;
  5.     // ucMode=C*4+B*2+A;
  6.     switch(ucMode) {
  7.         case 0: {
  8.            //  令Y0=0;
  9.             break;
  10.         }
  11.         case 1: {
  12.             //  令Y1=0;
  13.             break;
  14.         }
  15.         case 2: {
  16.             //  令Y2=0;
  17.             break;
  18.         }
  19.         case 3: {
  20.             //  令Y3=0;
  21.             break;
  22.         }
  23.         case 4: {
  24.             //  令Y4=0;
  25.             break;
  26.         }
  27.         case 5: {
  28.             //  令Y5=0;
  29.             break;
  30.         }
  31.         case 6: {
  32.             //  令Y6=0;
  33.             break;
  34.         }
  35.         case 7: {
  36.             //  令Y7=0;
  37.             break;
  38.         }
  39.     }
  40. }
 楼主| C洛达尔多 发表于 2015-10-25 20:52 | 显示全部楼层
由于开发板上不能直接提供3个按键和8个LED指示灯来模拟完成该实验,故这里只给出一个程序的结构以供参考。
6.计数器与频率计的实现,由于示例程序中侧重于定时功能,没涉及脉冲计数,所以需要参考其它资料编写,相关内容如下:
  1. u16 LPT_Ctr;    // 用于存储脉冲数
  2. int main(void)
  3. {
  4.         // 开启脉冲计数
  5.         LPTM_Init();  // LPTM初始化 使用通道2
  6.         // 开启PIT中断
  7.         PIT_Init(1000);  // 开启一个1000MS中断 用于脉冲计数
  8.         while(1)
  9.   {
  10.         // 显示LPT_Ctr 的计数值   
  11.         }
  12. }
  13. //函数名:LPTM_Init
  14. //功  能:LPTM模块初始化
  15. //说  明:channel  计数端口号LPTM_CH2,PORTC5
  16. //         计数范围为0~65535
  17. void LPTM_Init()
  18. {
  19. //开启模块时钟
  20. SIM->SCGC5|=SIM_SCGC5_PORTC_MASK;            //开启port口的模块时钟
  21. PORTC->PCR[5]&=~(PORT_PCR_MUX_MASK);
  22. PORTC->PCR[5]|=PORT_PCR_MUX(4);                 //配置io口为LPTM通道
  23. PORTC->PCR[5]|=PORT_PCR_PE_MASK;
  24. PORTC->PCR[5]&=~(PORT_PCR_PS_MASK);           //下拉电阻配置   
  25. SIM->SCGC5|=SIM_SCGC5_LPTIMER_MASK;                 //开启LPTM模块时钟
  26. LPTMR0->CSR|=LPTMR_CSR_TPS(Ch);                //选择输入通道
  27. LPTMR0->CSR&=~LPTMR_CSR_TPP_MASK;           //设置上升沿触发计数
  28. LPTMR0->CSR|=LPTMR_CSR_TFC_MASK;             //设置在自由运行模式下
  29. LPTMR0->CSR|=LPTMR_CSR_TMS_MASK;                       // 设置为计数模式
  30. LPTMR0->PSR|=LPTMR_PSR_PBYP_MASK;            // 忽略分频及滤波         LPTMR0->CSR|=LPTMR_CSR_TEN_MASK;             // 开启模块
  31. }
  32. //函数名:LPTM_Counter
  33. //功  能:LPTM模块计数器的计数值获取
  34. //说  明: 返回值为十六位的计数值
  35. u16 LPTM_Counter(void)
  36. {
  37.         u16 ch;
  38.         ch=(LPTMR0->CNR);                               //读取计数器的计数值
  39.         LPTMR0->CSR&=~(LPTMR_CSR_TEN_MASK);       //关闭模块
  40.         LPTMR0->CSR|=LPTMR_CSR_TEN_MASK;                         //开启模块,计数器清零
  41.         return(ch);
  42. }
  43. // 函数名:PIT_Init
  44. // time   设置定时器的时间,单位ms
  45. void PIT_Init(u32 time)
  46. {         
  47.         GetProcessorInfo();  //计算系统时钟
  48.         time=time*(PInfo.BusClock/1000);
  49.         //开始定时器配置
  50.         SIM->SCGC6|=SIM_SCGC6_PIT_MASK;      //开启pit模块时钟
  51.         PIT->MCR&=~PIT_MCR_MDIS_MASK;       //开启pit模块
  52.         PIT->MCR|=PIT_MCR_FRZ_MASK;          //开启pit模块
  53.         PIT->CHANNEL[pit].LDVAL=(uint32_t)time;   //设置延时时间
  54.     NVIC_EnableIRQ(PIT0_IRQn);break;     //开启内核接受中断
  55.         PIT->CHANNEL[pit].T标志寄存器|=PIT_T标志寄存器_TIF_MASK;  //清除标志位
  56.         PIT->CHANNEL[pit].TCTRL|=(PIT_TCTRL_TEN_MASK|PIT_TCTRL_TIE_MASK);//开启定时器及中断
  57. }
  58. //函数名:PIT0_IRQHandler
  59. //功  能:PIT中断通道0
  60. void PIT0_IRQHandler(void)
  61. {
  62.         PIT->CHANNEL[0].T标志寄存器|=PIT_T标志寄存器_TIF_MASK;//清标志位
  63.         LPT_Ctr=LPTM_Counter();
  64. }
 楼主| C洛达尔多 发表于 2015-10-25 20:53 | 显示全部楼层
计数器与频率计的主要区别就是一个有计数时间的限制,而另一个却不用。当计数脉冲为单位时基脉冲时,通过进制处理就可形成计时器。
7.串行通讯,在YL-KL26Z开发板上是以虚拟串口的方式由USB口来实现串行通讯的。借助串行通讯可在一定情况下替代数码显示缺失的不足,它是一种重要的程序调试和观察手段。此外,串行通讯也是连接上、下位机的桥梁,有了它就为自动测评提供了基础,通过读取下位机的实验数据就可分析出实验的成绩,为输出成绩报告予以有力的支持。
当然该实验平台的功能不仅局限于此,因为YL-KL26Z开发板的模拟信号处理能力还没有很好的使用,发挥16位ADC和12位DAC的作用,则可以将实验平台的功能延伸到模拟电路实验,从而形成一个综合型的实验平台。
当然YL-KL26Z开发板的潜力还很强大,还需近一步向前探索,以实现多媒体化的操作平台。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

236

帖子

0

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