飞翔科技电子爱好者论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3427|回复: 12

请教关于飞思卡尔单片机MC9S12XS128MAL的PWM功能

[复制链接]

14

主题

43

帖子

201

积分

中级会员

Rank: 3Rank: 3

积分
201
发表于 2018-10-24 22:17:56 | 显示全部楼层 |阅读模式
最近才接触飞思卡尔的单片机,之前用过51和AVR的,觉得飞思卡尔的MC9S12XS128MAL功能还是挺强大的。
学习PWM时候遇到个问题如下:
使用飞思卡尔单片机的PWM功能必须先进行锁相环设置吗?锁相环不就是用来倍频的吗?如果不设置就直接用外部晶振不行吗?
谢谢!
回复

使用道具 举报

14

主题

43

帖子

201

积分

中级会员

Rank: 3Rank: 3

积分
201
 楼主| 发表于 2018-10-25 08:34:17 | 显示全部楼层
哪位大神帮帮忙回答一下吧     谢谢!
回复 支持 反对

使用道具 举报

7

主题

371

帖子

1513

积分

超级版主

Rank: 8Rank: 8

积分
1513
发表于 2018-10-25 09:03:11 | 显示全部楼层
不设置锁相环也可以,设置锁相环的话可以按照自己的需要设置主频。如果不设置锁相环的话,主频是晶振频率的一半。
回复 支持 反对

使用道具 举报

14

主题

43

帖子

201

积分

中级会员

Rank: 3Rank: 3

积分
201
 楼主| 发表于 2018-10-25 09:43:02 | 显示全部楼层
那为啥我整理一段程序,前面是个初始化子函数,在不进行锁相环设置的情况下把相关寄存器都设置了一遍,然后再main函数中调用这个程序,想从P1口输出1HZ的PWM波形,就是不成功呢。而且,这个程序好奇怪,我连接BDM想下载这个程序的时候,居然也不提示BDM连接,也没有“下载该程序将导致单片机中正在运行的程序停止”的提示。这又是为啥呢?现在在上班,晚上回去把程序附上来请大神给看下,行吗?
回复 支持 反对

使用道具 举报

7

主题

371

帖子

1513

积分

超级版主

Rank: 8Rank: 8

积分
1513
发表于 2018-10-25 11:30:15 | 显示全部楼层
BDM连不上和程序没有关系,可能是系统更新把BDM驱动破坏了。
回复 支持 反对

使用道具 举报

14

主题

43

帖子

201

积分

中级会员

Rank: 3Rank: 3

积分
201
 楼主| 发表于 2018-10-25 14:07:28 | 显示全部楼层
bigmarshal 发表于 2018-10-25 11:30
BDM连不上和程序没有关系,可能是系统更新把BDM驱动破坏了。

但是我换个流水灯的程序就能正常下载呢,步骤和出现的提示跟说明书上一样
回复 支持 反对

使用道具 举报

14

主题

43

帖子

201

积分

中级会员

Rank: 3Rank: 3

积分
201
 楼主| 发表于 2018-10-25 21:41:39 | 显示全部楼层
bigmarshal 发表于 2018-10-25 11:30
BDM连不上和程序没有关系,可能是系统更新把BDM驱动破坏了。

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

/*不设置锁相环,总线频率为晶振频率的一半,即为8MHZ */

void PWM_Init(void){
  PWME = 0x00;        //禁止PWM模块
  PWMPRCLK = 0x33;    //CLOCKA的预分频设置8,则预分频之后为1MHZ
  PWMSCLA = 100;      //SA的分频因子设置100,则SA时钟为5KHZ
  PWMCLK = 0x02;      //通道1选择SA作为PWM时钟
  PWMPER1 =5000;      //通道1周期寄存器设置5000,则PWM频率为1HZ
  PWMDTY1 =2500;        //通道1占空比设置为2500,占空比为50%
  PWMPOL = 0X01;      //PWM输出先位高电平,后为低电平,急性选择寄存器
  PWMCAE = 0X00;      //左对齐输出
  PWMCTL = 0X10;      //通道0和通道1联级输出
  PWME = 0X02;        //使能PWM通道1

}

//延时函数
void delay(unsigned int delay_time) {
  unsigned int loop_i,loop_j;
  for(loop_i=0;loop_i<delay_time;loop_i++) {
    for(loop_j=0;loop_j<5000;loop_j++) {
      ;
    }
  }
}


void main(void) {
  /* put your own code here */
  unsigned char loop_index;
  DisableInterrupts;
  PWM_Init();
  EnableInterrupts;

  while(1) {

    for(loop_index=0;loop_index<2500;loop_index++) {
      PWMDTY1=loop_index;   //设置占空比,在这里作用是,使小灯亮的时间越来越久
      delay(5000);
    }


    for(loop_index = 2500;loop_index>0;loop_index--) {

      PWMDTY1 = loop_index;  //设置占空比,在这里作用是,使小灯亮的时间越来越短
      delay(5000);
    }
  }
}
这是我参考网上改的一段程序
不设置锁相环,使用SA时钟,且设置SA时钟为1HZ,然后改变占空比来观察。
现在的现象是,我使用BDM下载这个程序,提示Warning,说代码的第11和12行possible loss of data,然后BDM各种USB和六脚插针跟板子连接好之后,也不出现BDM连接的提示,然后也不提示“本程序的下载将使单片机中在运行的程序停止”的提示。
这是为啥呢,还请大神指点。想调成功一个最简单的PWM好几天了,还没弄出来
回复 支持 反对

使用道具 举报

7

主题

371

帖子

1513

积分

超级版主

Rank: 8Rank: 8

积分
1513
发表于 2018-10-26 09:11:06 | 显示全部楼层
你的程序有错误。0和1通道级联之后需要用1的标志和控制寄存器来控制和读取转台,PWMPOL 应该为0x02。
另外
PWMPER1 =5000;      //通道1周期寄存器设置5000,则PWM频率为1HZ
  PWMDTY1 =2500;        //通道1占空比设置为2500,占空比为50%
也是错的。
PWMPER1 和PWMDTY1 是两个8位寄存器。级联之后需要使用PWMPER01 和PWMDTY01
回复 支持 反对

使用道具 举报

14

主题

43

帖子

201

积分

中级会员

Rank: 3Rank: 3

积分
201
 楼主| 发表于 2018-10-26 09:15:14 | 显示全部楼层
bigmarshal 发表于 2018-10-26 09:11
你的程序有错误。0和1通道级联之后需要用1的标志和控制寄存器来控制和读取转台,PWMPOL 应该为0x02。
另外 ...

谢谢指点,我现在就想回去试一试再来上班了
周末再折腾一下。感谢你!
回复 支持 反对

使用道具 举报

14

主题

43

帖子

201

积分

中级会员

Rank: 3Rank: 3

积分
201
 楼主| 发表于 2018-10-26 10:14:45 | 显示全部楼层
bigmarshal 发表于 2018-10-26 09:11
你的程序有错误。0和1通道级联之后需要用1的标志和控制寄存器来控制和读取转台,PWMPOL 应该为0x02。
另外 ...

程序有错误,也是我在点击下载之后,BDM没有正常弹出一系列对话框的原因吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|飞翔科技电子爱好者论坛  

GMT+8, 2020-2-17 17:03 , Processed in 1.355847 second(s), 26 queries .

Powered by Discuz X3.2

© 2001-2011 Comsenz 源码论坛

返回顶部