注册会员
- 积分
- 41
- 威望
- 27
- 贡献
- 12
- 兑换币
- 14
- 注册时间
- 2013-12-20
- 在线时间
- 1 小时
|
求解释:程序如下
/***************************************************************************************
功能说明:MC9S128----舵机控制
使用说明:实现通道3(PTP3)输出频率为50HZ的方波,用示波器观察。按键PTH3实现舵机左转45度
按键PTH4实现舵机右转45度
程序设计:重庆机电职业技术学院车辆工程系汽车电子实验室
设计时间:2014年1月3日
***************************************************************************************/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include <mc9s12xs128.h> /* derivative information */
/***************************************************************************************
函数名称?void setbusclk_40M(void)
功能简介:设置总线频率40MHz,晶振频率16MHz
入口参数:无
出口参数:无
***************************************************************************************/
void setbusclk_40M(void)
{
CLKSEL_PLLSEL=0; //不使能锁相环时钟
PLLCTL_PLLON=1; //锁相环电路允许
SYNR=0XC0|0x04; //时钟合成寄存器
//VCO_clock=2*osc_clock*(1+SYNR)/(1+REFDV)=80MHz
//VCOFRQ[1:0]=1:1,代表VCO_clock在80~160MHz之间
REFDV=0X80|0X01; //VCO_CLOCK=2*osc_clock*(1+SYNR)/(1+REFDV)=80MHz
//REF_clock=osc_clock/(REFDV+1)=16/(1+1)=8MHz
//REFFRQ[1:0]=1:0,因为参考时钟在6~12MHz之间
POSTDIV=0X00; //VOC_clock=PLL_clock
//F(bus)=F(pll)/2
_asm(nop);
_asm(nop); //短暂延时,等待时钟频率稳定
while(!(CRGFLG_LOCK==1)) //时钟频率已稳定,锁相环频率锁定
{
;
}
CLKSEL_PLLSEL=1; // 使能锁相环
}
/***************************************************************************************
函数名称?void PWM_int(void)
功能简介:设置PWM模块初始化 开始输出高电平 左对齐
50HZ频率
入口参数:无
出口参数:无
***************************************************************************************/
//---------------------PWM通道3初始化程序-------------------//
void PWM_Init(void)
{
PWME_PWME3=0x00; // PWW is disabled 禁止
PWMPRCLK=0x20; // 0b0011 0011 A=B=40M/4=10M 时钟预分频寄存器设置
PWMSCLB=100; // SB=B/2/125=5000hz 时钟设置
PWMCTL=0x20; // 通道2,3级联 控制寄存器设置
PWMCLK_PCLK3=1; // PWM3-----SB 时钟源的选择
PWMPOL_PPOL3=1; // 开始输出高电平 极性设置
PWMCAE_CAE3=0; // 左对齐 对齐方式设置
PWMPER23=1000; // Frequency=SB/100=50 周期寄存器设置
PWMDTY23=75; // Duty cycle = 50% 占空比寄存器设置
PWME_PWME3=1; // enable 使能
}
void main()
{
DDRH=0X00;
PTH=0XFF;
setbusclk_40M();
PWM_Init();
while(1)
{
switch(PTH)
{
case 0XF7WMDTY3=50; break; //左转45度
case 0XEF:PWMDTY3=100; break; //右转45度*/
case 0xfb:PWMDTY3=25; break; //左转90度
case 0xdf:PWMDTY3=125; break; //右转90度
case 0x7f:PWMDTY3=75; break; //舵机回正
}
}
}
|
|