Designed by 袁思远
E-mail:fantasy_ysy@163.com
最后更新:2012年10月29日
相关信息参考下列地址:
博客: http://blog.163.com/fantasy_ysy/
本程序主要包括以下功能:
1. 设置系统工作在80MHZ 总线时钟
2. 电机控制 PP3引脚
10K
3. 舵机控制 PP1引脚
20ms
3.
测速
PT7
脉冲计数
4. 产生周期10ms的中断
unsigned int PAnum;
void SetBusCLK_80M(void)
{
CLKSEL=0X00; //disengage
PLL to system
PLLCTL_PLLON=1; //turn
on PLL
SYNR =0xc0 |
0x09;
REFDV=0x80 | 0x01;
POSTDIV=0x00;
//pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
_asm(nop);
//BUS CLOCK=80M
_asm(nop);
while(!(CRGFLG_LOCK==1));
//when pll is steady ,then use it;
CLKSEL_PLLSEL
=1;
//engage PLL to system;
}
void PWMcsh(void)
{
PWMPOL=0X0a; //通道 1 3
输出波形开始极性为1
PWMCAE=0x00;
//左对齐输出模式
PWMCLK=0X0a;
//PWM通道1时钟源为 SAClock 通道3时钟源为 SBClock
PWMPRCLK=0X13; //总线时钟8分频得到Clock A is
80MHz/8=10000kHz 2分频得到Clock B is 80MHz/2=40000kHz
PWMCTL=0x30;
//0 1 和 2 3 通道级联成16位PWM通道 引脚PP1 PP3
PWMSCLA=0X05; //对Clock A
5*2分频,时钟SA为80M/8/5/2=1000kHz
PWMSCLB=0X02; //对Clock B
2*2分频,时钟SB为80M/2/2/2=10000kHz
PWMPER0=0X4e;
//周期因数高8位 0x4e20 =
20000
PWMPER1=0X20;
//周期因数低8位,输出周期=通道时钟周期*20000,即频率=1000k/20k=50Hz, 即周期为20ms
PWMPER2=0X03;
//周期因数高8位 0x03e8 =
1000
PWMPER3=0Xe8;
//周期因数低8位,输出周期=通道时钟周期*1000,即频率=10000k/1000=10k
PWMDTY01=1550;
//占空比
1550/20000 零点
PWMDTY23=320;
//占空比
320/1000
PWME=0X0a;
//通道 1 3 使能 enable pwm channel 1 3 PP1
PP3引脚
}
void PAInit(void)
{
PACNT=0x0000;
//设置脉冲累加器计数寄存器初始值为0
PACTL=0x40;
//使能 计数模式 下降沿计数 禁止中断
禁止定时器不影响脉冲累加器计数功能的使用
}
void PIT_Init(void)
{
PITCFLMT =
0x00;
//禁止PIT模块
PITCE_PCE0 =
1;
//使能定时器通道0
PITMUX =
0x00;
//定时器通道0使用Base Timer0(微定时基准0)
PITMTLD0 =
0xff;
//设置8位微定时装载寄存器0初值(8位计数器初值)
PITLD0 =
0xC34;
//设置16位装载寄存器0初值(16位计数器初值)
//定时周期=($PITMTLD0+1)*($PITLD0+1)*(1/fbus)
//
=256*3125/80000000
//
=0.01s = 10ms
PITINTE =
0x01;
//使能PIT定时器通道0中断
PITCFLMT =
0x80;
//使能PIT模块
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//void interrupt 66 PIT_ISR(void)
void interrupt VectorNumber_Vpit0 PIT_ISR(void)
{
PITTF_PTF0 =
1;
//清中断标志
PAnum=PACNT;
//读脉冲计数
PACNT=0;
//设置脉冲累加器计数寄存器初始值为0
//
PTM=~PTM;
}
#pragma CODE_SEG DEFAULT
void delay( int aa)
{
int ii,jj,kk;
for(ii=aa;ii>0;ii--)
{
for(jj=300;jj>0;jj--)
for(kk=30;kk>0;kk--);
}
}
void main(void)
{
EnableInterrupts;
SetBusCLK_80M();
PWMcsh();
PIT_Init();
PAInit();
DDRM =
0x03;
//PM0引脚作为输出
PTM =
0x00;
// PM0引脚为0
for(;;)
{
PTM=0x01;
delay(330);
PTM=0x00;
delay(330);
//_FEED_COP();
}
}