智能车制作

标题: 求教有关PWM控制舵机的程序 [打印本页]

作者: 南极之星    时间: 2010-4-6 10:58
标题: 求教有关PWM控制舵机的程序
这个是我从一本教科书上找来的程序,想拿来试下用PWM控制舵机
但是不懂为什么没有波形输出
因为是新手,悬赏不是很多。。。。
程序如下
  1. #include <hidef.h>     
  2. #include <mc9s12dg128.h>     
  3. #pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


  4. #define BUS_FREQ    32000000                    //总线频率
  5. #define PWM_PRCLK   0x22                        //CH_A=CH_B=BUS_FREQ/4            
  6. #define CH_A_FREQ   8000000                     //时钟A频率
  7. #define CH_B_FREQ   8000000                     //时钟B频率
  8. #define CH_SA_FREQ  1000000                     //时钟SA频率
  9. #define CH_SB_FREQ  1000000                     //时钟SB频率
  10. #define CH_SA_DIV   (CH_A_FREQ/(CH_SA_FREQ*2))  //CH_SA_DIV=4
  11. #define CH_SB_DIV   (CH_B_FREQ/(CH_SB_FREQ*2))  //CH_SB_DIV=4
  12. #define STEER_FREQ  100                         //舵机频率100Hz


  13. void Pwm_init(void) {
  14.   PWMPRCLK=PWM_PRCLK;
  15.   PWMSCLA=CH_SA_DIV;
  16.   PWMSCLB=CH_SB_DIV;
  17.   PWMCTL_CON45=1;、                            //组合PWM45
  18.   PWMCTL_CON67=1;
  19.   PWMCTL_CON23=1;
  20.   
  21.   PWMCLK_PCLK5=1;                              //PWM5使用SA
  22.   PWMCLK_PCLK3=1;
  23.   PWMCLK_PCLK7=1;
  24.   
  25.   PWMPER45=(CH_SA_FREQ/STEER_FREQ);      
  26.   PWMPER23=(CH_SB_FREQ/MOTOR_FREQ);
  27.   PWMPER67=(CH_SB_FREQ/MOTOR_FREQ);
  28.   PWMPOL_PPOL5=1;                               //写PWM45的周期寄存器
  29.   PWMPOL_PPOL3=0;
  30.   PWMPOL_PPOL7=0;
  31.   PWMCAE=0x00;
  32.   PWME_PWME5=1;                                  //左对齐
  33. }

  34. void Motor_back(uint duty) {
  35.   PWMDTY45=duty;
  36. }
  37. void delay(unsigned int delay_time) {
  38.   unsigned int loop_i,loop_j;
  39.   for(loop_i=0;loop_i<delay_time;loop_i++)
  40.     for(loop_j=0;loop_j<500;loop_j++)
  41.     _FEED_COP();
  42. }

  43. void main(void) {
  44.   
  45.   Pwm_init();
  46.   Motor_back(9250);
  47.   delay(2000);
  48.   for(;;){
  49.     Motor_back(9500);
  50.     delay(2000);
  51.     Motor_back(9000);
  52.     delay(2000);
  53.   }
  54. }
复制代码

作者: cys179    时间: 2010-4-6 16:42
你随便找个技术报告后面的pwm初始化代码用上就可以了。这个就几个寄存器的初始化没什么难度的。技术报告后面的代码可能没有问题。

补充内容 (2015-4-23 09:15):
真人游戏|足球篮球|时时彩| 六合投注| 网络赚钱去SO娱乐城:顶级信用,提现百分百即时到账SO.CC


作者: 南极之星    时间: 2010-4-7 21:05
找了几个试了下,但是舵机仍旧是只有上电的瞬间会动下
作者: lhlacml    时间: 2010-4-7 23:45
怎么都是DG的啊,没有XS的吗
作者: 446373380    时间: 2010-4-8 10:27
急需解决啊
作者: dzh1024    时间: 2010-4-8 10:49
新手 不懂
作者: clgt2001    时间: 2010-4-8 19:47
新手 不懂
作者: lhqx    时间: 2010-4-8 21:19
不明白
作者: jiutian0396    时间: 2010-4-11 09:16
使劲看看就明白了
作者: cyyan    时间: 2010-4-22 21:11
试试这个
void main(void) {
  /* put your own code here */
   PWME=0X00;//
   PWMCTL=0X00;
   PWMPRCLK=0X66;
   PWMCLK=0XFF;
   PWMSCLA=0X0D;
   PWMSCLB=0X0D;
   PWMPOL=0XFF;
   PWMCAE=0X00;
   PWMPER0=0X09;
   PWMDTY0=0X05;
   PWME=0X01;
        EnableInterrupts;


  for(;;) {
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
作者: luoguoying    时间: 2010-4-22 21:25
试试我编的这个:
//-------------------------------------------
//功能说明:MC9S12XS128--PWM 例程
//使用说明:实现通道3(PP3)输出频率为50Hz,占空比为2%至14%之间循环变化
//-------------------------------------------
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <MC9S12XS128.h>     /* derivative information */
#define uint unsigned int
#define uchar unsigned char
uchar PWMDTY_NUM=13;      //PWM通道周期寄存器
//-----时钟初始化程序------//
void PLL_Init(void)
{
  REFDV=1; //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
  SYNR=2; //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
  while(!(CRGFLG & 0x08));
  CLKSEL=0x80; //选定锁相环时钟
}
//--------------------------------
void Delay(void) {
  unsigned int i,j;
  for(i=0;i<50;i++)
    for(j=0;j<3388;j++);
}
//------------------------------
void MCU_Init(void)
{
  DDRB=0x00;
  DDRP=0x08;
  PUCR_PUPBE=1;
}
//-------PWM初始化程序--------//
static void PWM_Init(void)
{
// PWME_PWME3=0;
  PWMPRCLK=0x55;//0010 0010 A=B=24M/32=750K 时钟预分频寄存器设置
  PWMSCLA=5;    //SA=A/2/5=75K
  PWMSCLB=50;   //SB=B/2/50=7.5K
  PWMCLK_PCLK3=1;//PWM3---SB
  PWMPOL_PPOL3=1;//Duty=High Time
  PWMCAE_CAE3=0;//Left-aligned
  PWMCTL=0x00;  //no concatenation
  PWMPER3=150;   //Frequency=SB/150=50
  PWMDTY3=13;    //Duty cycle=8.6%
  PWME_PWME3=0; //Disable PWM
}
//--------PWM占空比改变函数---------//
//---K每改变1,占空比就改变0.7%
void Change_dutycycle(uchar k)
{
  PWME_PWME3=1;
  PWMDTY3=k;
//  PWM_Init();
}
//-------------------------------------------------
void main(void) {
  /* put your own code here */
  PLL_Init();
  PWM_Init();
  MCU_Init();
//  EnableInterrupts;
   PWMDTY_NUM=13;
  for(;;) {
   
  
         PWMDTY_NUM++;
        if(PWMDTY_NUM>23){
          PWMDTY_NUM=2;
          Delay();
        }
        
        Change_dutycycle(PWMDTY_NUM);

//   _FEED_COP(); /*feeds  the dog*/
  } /* loop forever */
  /* please make sure that you never leave main */
}
作者: zwypp0304    时间: 2010-4-23 22:36
谢谢分享
作者: zwypp0304    时间: 2010-4-23 22:37
谢谢分享
作者: tz0704321    时间: 2010-5-9 12:48

作者: 言言非心    时间: 2011-9-27 15:19
求高手了!
作者: 无敌快车    时间: 2011-11-22 21:28
那我也先收藏一下
作者: liyun9999    时间: 2012-2-26 19:35
没有波形。。。
作者: 了修明日    时间: 2013-4-6 15:10
xuexi
作者: 誉,    时间: 2013-4-6 17:41
cyyan 发表于 2010-4-22 21:11
试试这个
void main(void) {
  /* put your own code here */

亲···能注释下么?




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2