General.C
#include \ //包含通用函数头文件
//-------------------------------------------------------------------------*
// 函数名: Delay() // 功 能: 延时 // 参 数: count(小于65535) // 返 回: 无 //-------------------------------------------------------------------------* void delay(uint16 count) { uint16 i,j; for(j=0; j 实验六 AD转换与PWM综合实验 一、实验目的: 1.熟练运用嵌入式开发系统环境、C语言及调试方式; 2.理解定时器模块及AD模块工作原理; 3.初步掌握定时器PWM输出功能及程序设计方法; 4.初步掌握AD模块进行单通道AD转换功能及程序设计方法; 5.进一步熟悉LED数码块显示编程原理及方法。 二、实验要求: 1.仔细阅读本实验指导书。 2.复习有关的定时器及AD转换章节。 3.熟悉定时器模块的原理及PWM功能及编程方法。 4.熟悉AD模块原理、结构、AD转换功能和编程方法。 4.根据实验内容要求编写好程序,为实验做充分地准备。 三.实验设备及其连接 1.PC机 一台 2.飞思卡尔嵌入式实验开发系统 一台 3.PE2(定时器1通道)接口连接到一个LED灯,观察PWM输出占空比变化的PWM时,LED灯的变化。 4.通过实验箱上电位器输出插孔将电位器电压输入到AD转换模块的15号通道PTD7,对电位器输出电压进行AD转换,并将转换后得到的数值再还原为电压值在LED数码块上显示。 四.实验内容 1.理解并运行PWM例程序(经PTD0上插孔连接一个LED灯,当接在定时器1通道0上的开关上下拨动时,捕捉通道上的上升沿与下降沿,捕捉到时让LED灯亮一会然后熄灭); 2.理解并运行AD转换样例程序(将用测试线连接电位器输出插也及PTD7,旋转电位器调节其输出电压,在LED数码块上显示对应的电压值。); 3.在理解上面两个样例程序的基础上,自行设计用电位器控制PWM占空比,PWM输出接在一个LED灯上,并在LED数据块电位器输出电压值,观察LED灯的亮度与电压值的关系。 五.编程提示 1.在改变PWM的周期和占空比之前要禁止使用TPM(TPMxSC的CLKSB、CLKSA为00),然后设置占空比、周期等,再重新写TPMxSC,否则改变不起作用。 2.实验箱上的LED数码块的接口连接是固定的,要注意AD转换通道与LED数码块接口不要 冲突。 3.当GPIO作为LED输出段码驱动接口时,共阴级数码块可考虑在输出接口上加上位电阻增强驱动能力。 六.实验报告要求 1.按实验报告格式认真完成实验报告,要求画出工程的总体流程图; 回答下列问题: 2.回答下列问题 (1)定时器通道的PWM输出与输出比较有什么共同及不同处?如果用于小直流电机的速度控制,应该用什么方式? (2)在本实验中,如果AD转换中需要有数值比较功能,当通道送入电压超过4.5V时需要报警,即让一个LED灯闪烁,应该如何设计? 七.参考例程: PWM输出程序: Main.c //总头文件 #include \void main(void) { DisableInterrupts; MCUInit(); //MCU初始化 TPM1PWMInit(0); //定时器1初始化 EnableInterrupts; while(1){ uint8 i; for(i=0;i<=200;i++){ if (i<=100) TPM1PWMRun(0,i,0x0998); else TPM1PWMRun(0,200-i,0x0998); delay(100); } } } TMP.c void TPM1PWMInit(uint8 CHn) { //分频因子64,设置为系统时钟,禁止溢出中断,清溢出标志 TPM1SC=0b00000110; TPM1CNTH=0x00; TPM1CNTL=0x00; TPM1MODH=0x10; //预置寄存器设定值 = 0x1012 TPM1MODL=0x12; if (CHn>5) CHn=5; switch(CHn){ case 0:TPM1C0SC=0b00110100;break; case 1:TPM1C1SC=0b00110100;break; case 2:TPM1C2SC=0b00110100;break; case 3:TPM1C3SC=0b00110100;break; case 4:TPM1C4SC=0b00110100;break; case 5:TPM1C5SC=0b00110100;break; } } void TPM1PWMRun(uint8 CHn,uint8 percent,uint16 ModP){ uint16 duty,MP; uint8 dutyH,dutyL; MP=ModP ; TPM1SC=0x00; TPM1CNTH=0x00; TPM1CNTL=0x00; TPM1MODL=(uint8)(ModP); TPM1MODH=(uint8)(ModP>>8); duty=(uint16)((MP/100)*percent); dutyL=(uint8)(duty); dutyH=(uint8)(duty>>8); if (CHn>5) CHn=5; switch(CHn){ case 0: TPM1C0VH=dutyH;TPM1C0VL=dutyL;TPM1C0SC=0b00111100;break; case 1: TPM1C1VH=dutyH;TPM1C1VL=dutyL;TPM1C1SC=0b00111100;break; case 2: TPM1C2VH=dutyH;TPM1C2VL=dutyL;TPM1C2SC=0b00111100;break; case 3: TPM1C3VH=dutyH;TPM1C3VL=dutyL;TPM1C3SC=0b00111100;break; case 4: TPM1C4VH=dutyH;TPM1C4VL=dutyL;TPM1C4SC=0b00111100;break; case 5: TPM1C5VH=dutyH;TPM1C5VL=dutyL;TPM1C5SC=0b00111100;break; } TPM1SC=0b00001110; } Generalfun.c void delay(uint16 count) { } AD转换例程: Main.c //总头文件 #include \void main(void) { uint8 V1Value; DisableInterrupts; LEDBUF[0]=0; LEDBUF[1]=0; LEDBUF[2]=0; LEDBUF[3]=0; uint8 i; uint16 j; for(j=0; j