打印
[疑难问答]

MPC82E54笙泉单片机写AD转换

[复制链接]
4157|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
paifeng253625|  楼主 | 2010-8-10 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人初学MPC,求用MPC82E54写的通过电阻调节电压,输入到AD转换,再输出PMW脉宽的C语言程序。谢谢大师们能帮帮我,不胜感激!!
沙发
David_ming| | 2010-8-11 09:54 | 只看该作者
做些改动即可

#include <REG_MPC82G516.H>



void main(void)
{       
        P1M0  |= 1<<7;  //P1.0 SET of Z mode
        P1M1  &= ~(1<<7);  //
        AUXR  &= ~0x40; //
        ADCTL  = 0xe7;
       
        P1M1  |= 1<<2;  //
        P1M0  &= ~(1<<2);  //
               
        CCAP0H = 0x00; //initial
        PCAPWM0 = 0x00;        //0% - 99%
        CCAPM0 = 0x42; //enable edge trigger & interrupt
        CMOD   = 0x02; //fosc/2,disable PCA overflow interrupt
        CCON   = 0x40; //start to run
       
        while(1)
        {
                ADCTL|= 0x08;
                while((ADCTL & 0x10) != 0x10);//_nop_();
                CCAP0H = ADCH;
        }

}

使用特权

评论回复
板凳
paifeng253625|  楼主 | 2010-8-12 09:25 | 只看该作者
谢谢David_ming,那么脉冲输出是哪I/O口脚呢,感觉MPC比51难学多了。如果我设置两路电压输入AD,再调节两路脉冲输出,是不是设置P1M1的通道选择位就行了?

使用特权

评论回复
地板
paifeng253625|  楼主 | 2010-8-12 17:54 | 只看该作者
现在我想设置两路输入和两路输出怎么设置呀?

使用特权

评论回复
5
paifeng253625|  楼主 | 2010-8-13 17:10 | 只看该作者
本帖最后由 paifeng253625 于 2010-8-13 17:17 编辑

单独一路没问题,现在是两路一起工作就有问题,是什么原因呢?麻烦帮分析一下!
用二楼David_ming的代码修改的:非常感谢他的帮助。
#include <Intrins.h>
#include "reg_mpc82l52.h"

/************延时函数*****************/
void delay5ms()        //5ms延时函数
{
    unsigned int i;
    for(i=0;i<4978;i++) ;
}
void delay4s()        //4s延时函数
{
        unsigned int j;
        for(j=0;j<=800;j++)
        {
        delay5ms();
        }
}

/***AD转换、PCA模块、PWM调制输出函数***/
void AD_ZH(void)
{
        AUXR  &= ~0x40; //        中断使能
        CMOD   = 0x02; //fosc/2,disable PCA overflow interrupt  PCA模式控制寄存器,时钟来源为Fosc/2
        CCON   = 0x40; //start to runPCA控制寄存器,启动PCA
//         ADCTL|= 0x08; //开始转换
        if(P30==0)                   //A键按下
                {
                P1M0  |= 1<<7;  //P1.0 SET of Z mode////作为ADC输入的IO口,一定要设成输入(Input Only)模式
                P1M1  &= ~(1<<7);  ////此DEMO程序只用到P17作为ADC输入口
//               AUXR  &= ~0x40; //        中断使能
                ADCTL  = 0xe7;         //        ADC转换控制寄存器 11100111,1打开ADC模块电源,11转换速度选择寄存器 210个机器周期,
        
                P1M1  |= 1<<2;  //
                P1M0  &= ~(1<<2);  //
               
                CCAP0H = 0x00; //PCA模块0计数寄存器。设置PCA改变空占比
                PCAPWM0 = 0x00;        //0% - 99%PWN模式,模块0辅助寄存器
                CCAPM0 = 0x42; //enable edge trigger & interrupt配置PCA模块0为8位PWM输出模式
//                      CMOD   = 0x02; //fosc/2,disable PCA overflow interrupt  PCA模式控制寄存器,时钟来源为Fosc/2
//               CCON   = 0x40; //start to runPCA控制寄存器,启动PCA
               ADCTL|= 0x08; //开始转换
                while((ADCTL & 0x10) != 0x10);//_nop_();  //检查是否转换完成
                CCAP0H = ADC;
        }
        if(P34==0)                   //B键按下
                {
                P1M0  |= 1<<5;  //P1.0 SET of Z mode////作为ADC输入的IO口,一定要设成输入(Input Only)模式
                P1M1  &= ~(1<<5);  ////此DEMO程序只用到P15作为ADC输入口
//               AUXR  &= ~0x40; //        中断使能
                ADCTL  = 0xc5;         //        转换控制寄存器
        
                P1M1  |= 1<<3;  //
                P1M0  &= ~(1<<3);  //
               
                CCAP1H = 0x00; //PCA模块0计数寄存器。设置PCA改变空占比
                PCAPWM1 = 0x00;        //0% - 99%PWN模式,模块0辅助寄存器
                CCAPM1 = 0x42; //enable edge trigger & interrupt配置PCA模块0为8位PWM输出模式
//                      CMOD   = 0x02; //fosc/2,disable PCA overflow interrupt  PCA模式控制寄存器,时钟来源为Fosc/2
//               CCON   = 0x40; //start to runPCA控制寄存器,启动PCA
                      ADCTL|= 0x08; //开始转换
                while((ADCTL & 0x10) != 0x10);//_nop_();  //检查是否转换完成
                CCAP1H = ADC;
        }                                       
}

/**************主函数******************/
void main(void)
{
        while(1)
        {
        P35=1;
        P37=1;
        AD_ZH();
        delay4s();                                                //关闭PCA
        CMOD = 0;
        CCAP0H = 0;
        CCAPM0        =        0;                                
        CCAP0L        =        0;                                
        CCAP0H        =        0;
        P35 = 1;                                
        P37 = 1;
        }
}

使用特权

评论回复
6
David_ming| | 2010-8-14 09:48 | 只看该作者
可以将AD分时复用,一个通道转换完把结果传给PWM0,再转换另一个通道,再传给PWM1,依此类推。AD的IO一般设置成高阻模式,PWM的IO一般都设置成推挽。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[color=red] 人生如棋:别人为車,我愿为卒;行动虽慢,有谁见我后退一步...[/color]

0

主题

83

帖子

3

粉丝