智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 10521|回复: 13
打印 上一主题 下一主题

[控制类] 求PWM控制二相步进电机程序,谢谢

  [复制链接]

11

主题

41

帖子

0

精华

高级会员

Rank: 4

积分
772
威望
297
贡献
293
兑换币
0
注册时间
2010-1-16
在线时间
91 小时
跳转到指定楼层
1#
发表于 2010-2-27 18:55:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
求PWM控制二相步进电机程序,谢谢

10

主题

126

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2604
威望
567
贡献
1795
兑换币
130
注册时间
2009-6-6
在线时间
121 小时
2#
发表于 2010-3-1 23:03:22 | 只看该作者
等待答案的出现...自己动手!
回复

使用道具 举报

11

主题

41

帖子

0

精华

高级会员

Rank: 4

积分
772
威望
297
贡献
293
兑换币
0
注册时间
2010-1-16
在线时间
91 小时
3#
 楼主| 发表于 2010-3-13 12:03:18 | 只看该作者


复制代码
  1. #include <hidef.h> /* common defines and macros */
  2. #include <MC9S12XS128.h> /* derivative information */
  3. #pragma LINK_INFO DERIVATIVE "mc9s12xs128"
  4. //unsigned char g,s,b,q;
  5. unsigned char table[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,0xff };

  6. void delay(unsigned int t)
  7. { unsigned int i,j;
  8. for(i=0;i<t;i++)
  9. for(j=0;j<110;j++);

  10. }

  11. void disp(unsigned char g,unsigned char s,unsigned char b,unsigned char q)
  12. { DDRM=0xff;
  13. DDRH=0xff;
  14. PTM=0b00000001;
  15. PTH=table[g];
  16. delay(20);
  17. PTM=PTM<<1;
  18. PTH=table[s];
  19. delay(20);
  20. PTM=PTM<<1;
  21. PTH=table[b];
  22. delay(20);
  23. PTM=PTM<<1;
  24. PTH=table[q];
  25. delay(20);
  26. }

  27. void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)

  28. { //锁相环时钟=2*16*(2+1)/(1+1)=48MHz

  29. REFDV=1; //总线时钟=48/2=24MHz

  30. SYNR=2;

  31. while(!(CRGFLG&0x08));

  32. CLKSEL=0x80;

  33. }

  34. void pwminitial0()
  35. {
  36. PWMPOL=0X81; //通道0、7输出波形开始极性为高 output waveform which high first then low when the duty counter is reached
  37. PWMCAE=0x80; //0左对齐输出模式、7居中对齐 output left align waveform
  38. PWMCLK=0X81; //PWM时钟源为0 SA,7-SB SAClock SA is the clock source for PWM channel 0
  39. PWMPRCLK=0X23; //时钟A8分频 Clock A is 24MHz/8=3MHz
  40. PWMSCLA=0X96; //时钟SA为3MHz/300=10khz
  41. PWMSCLB=0X96;
  42. PWMPER0=100; //设定输出周期=通道时钟周期*20 f=100hz
  43. PWMPER7=100;
  44. PWMDTY0=50; //占空比初始为0 Duty is 50%,and PWM waveform's frequent is 16
  45. PWMDTY7=50;
  46. PWME=0X81; //通道0使能 enable pwm channel 0

  47. }

  48. /*void pwminitial1()
  49. {
  50. PWMPOL=0X02; //通道1输出波形开始极性为1 output waveform which high first then low when the duty counter is reached
  51. PWMCAE=0x02; //居中对齐输出模式 output left align waveform
  52. PWMCLK=0X03; //PWM时钟源为 SAClock SA is the clock source for PWM channel 1
  53. PWMPRCLK=0X06; //时钟A8分频 Clock A is 8MHz/8=1MHz
  54. PWMSCLA=0Xff; //时钟SA为1MHz/128/2 Clock SA is 1MHz/128/2=4KHz

  55. PWMPER1=122; //设定输出周期=通道时钟周期*256
  56. PWMDTY1=61; //占空比初始为0.5 Duty is 50%,and PWM waveform's frequent is 16
  57. PWME=0X02; //通道1使能 enable pwm channel 0

  58. }*/
  59. void main()
  60. {

  61. pwminitial0();
  62. DDRA=0xff;
  63. // pwminitial1();
  64. for(;;) {

  65. PORTA_PA1=PTP_PTP7;
  66. PORTA_PA3=PTP_PTP0;
  67. PORTA_PA4=0;
  68. PORTA_PA5=0;
  69. PORTA_PA6=0;
  70. PORTA_PA7=0;
  71. PORTA_PA0=1;

  72. // PORTA=PTP;

  73. if(PORTA_PA3==0&&PORTA_PA1==1)
  74. disp(1,10,10,10) ;
  75. else if(PORTA_PA3==0&&PORTA_PA1==0)
  76. disp(10,2,10,10) ;

  77. else if(PORTA_PA3==1&&PORTA_PA1==0)
  78. disp(10,10,3,10) ;

  79. else//(PTP_PTP0==1&&PTP_PTP1==1)
  80. disp(10,10,10,4) ;

  81. }
  82. /* please make sure that you never leave this function */
  83. }
复制代码
回复

使用道具 举报

9

主题

199

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
8268

论坛元老奖章

QQ
威望
529
贡献
7627
兑换币
0
注册时间
2010-1-10
在线时间
56 小时
4#
发表于 2010-3-17 12:25:47 | 只看该作者
谢谢
回复

使用道具 举报

11

主题

212

帖子

0

精华

常驻嘉宾

侠客

Rank: 8Rank: 8

积分
5969

论坛元老奖章

威望
2649
贡献
3234
兑换币
0
注册时间
2010-1-13
在线时间
43 小时
5#
发表于 2010-4-3 15:19:21 | 只看该作者
谢谢yzst 了
回复

使用道具 举报

5

主题

51

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
10711

论坛元老奖章

QQ
威望
323
贡献
10380
兑换币
0
注册时间
2010-7-6
在线时间
4 小时
6#
发表于 2010-12-3 13:14:19 | 只看该作者
谢谢
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
威望
205
贡献
44
兑换币
0
注册时间
2011-3-30
在线时间
1 小时
7#
发表于 2011-4-9 10:17:02 | 只看该作者
谢谢大侠
回复

使用道具 举报

3

主题

39

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1492
QQ
威望
1212
贡献
244
兑换币
0
注册时间
2012-5-24
在线时间
18 小时
毕业学校
常熟理工学院
8#
发表于 2012-6-2 10:42:33 | 只看该作者
谢啦!
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
869
QQ
威望
676
贡献
107
兑换币
0
注册时间
2011-10-18
在线时间
43 小时
9#
发表于 2012-9-24 12:32:44 | 只看该作者
谢谢 我也非常需要啊
回复

使用道具 举报

3

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
威望
199
贡献
70
兑换币
20
注册时间
2012-9-10
在线时间
16 小时
10#
发表于 2012-11-20 14:45:25 | 只看该作者
#include <hidef.h>      /* common defines and macros */
#include <mc9s12xs128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"

void initpll(void)//40MHz,外部时钟为16MHz
{
     CLKSEL_PLLSEL=0;
     PLLCTL_PLLON=0;
     SYNR=0xc0 | 0x07;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
     REFDV=0x80 | 0x01;
     PLLCTL_PLLON=1;
     asm  NOP;
     asm  NOP;
     asm  NOP;
     while((CRGFLG&0X08)==0);//时钟校正同步
     CLKSEL_PLLSEL=1;
}

void main(void)
  {   initpll();
      PWME=0x00;
      PWMCTL=0X10;    //01连起来供给舵机
      PWMCAE=0X00;
      PWMPOL=0XFF;    //先输出高电平
      PWMCLK=0X03;    //01选择SA时钟,23选择B,45选择A
      PWMPRCLK=0X55;  //对A时钟进行32分频,B时钟进行32分频 A=2M B=2M
      PWMSCLA= 4;     //SA=2M/(2*4)=250K
      PWMPER01=5000;  // 周期为 250K/5000=50HZ  舵机
      PWMDTY01=430;  //  舵机的中间位置440,增大往右530转差不多40度,减小往左380转差不多 舵机从最左到最右的时间为160MS
      PWMPER3=200;    //  周期为 2M/200=10KHZ   电机左 正转
      PWMPER2=200;
      PWMDTY2=50;    //  左电机
     PWMDTY3=0;          //电机左  正转
      PWMPER4=200 ;
      PWMPER5=200;    //  占空比为 0% 左电机
      PWMDTY5=0;    //   电机右 正转
      PWMDTY4=100;      ///电机右  反转
      //PWMDTY4=0 ;  
      //占空比为 0% 右电机
      PWME=0XFF;   //通道使能
   
   
  EnableInterrupts;
  for(;;) {} /* wait forever */
  /* please make sure that you never leave this function */
}
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 17:27 , Processed in 0.054602 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表