求助,急!!!!!!!!!!!!

[复制链接]
1969|8
 楼主| 609044735 发表于 2012-9-23 21:17 | 显示全部楼层 |阅读模式
EPS中用pwm控制电机,转矩连续变化时A/D转换控制占空比,当占空比是连续变化的,pwm为什么有几处不随着占空比改变而改变,有跳跃
NE5532 发表于 2012-9-23 21:43 | 显示全部楼层
确认没看懂,请楼主再描述一下。
 楼主| 609044735 发表于 2012-9-24 11:14 | 显示全部楼层
好,电动助力转向系统的控制单元中用的是PIC单片机。转矩传感器检测到转矩后,单片机根据转矩的大小控制电机的转动。用pwm控制电机的转速,转矩控制占空比。在仿真时,转矩连续变化,示波器检测到的pwm波没有连续变化,有两处跳跃的现象。检查过程序了,没有错误啊。难道跟硬件有关吗啊?希望高手指点指点,谢谢
 楼主| 609044735 发表于 2012-9-24 11:19 | 显示全部楼层

  1. void ADC1_Init(void)
  2. {
  3. TRISA0=1;                //模拟通道0设置为输入         
  4. ADCON1=0b10000010;//配置引脚工作方式,转换结果右对齐
  5. ADCON0=0b00000001;//使用单片机主频二分频作为转换时钟,选择通道0进行AD转换
  6. }
  7. void InitAPWM()
  8. {   
  9. TRISC2=0;//RC2作为PWM模式输出引脚
  10. T2CKPS1=0;
  11. T2CKPS0=0;//TMR2预分频比为1:1,且使能TMR2模块
  12. PR2=249;//PR2=(1/16KHZ)/(4*(1/16MHZ)-1=249(PWM模式周期/(4*Tosc*TMR2预分频值))-1
  13. CCPR1L=((uint8)(wide>>2))&0x0FF;
  14. if((((uint8)(wide>>1))&0x01)==1) CCP1X=1;
  15. else CCP1X=0;
  16. if((((uint8)wide)&0x01)==1) CCP1Y=1;
  17. else CCP1Y=0;
  18. CCP1M3=1;
  19. CCP1M2=1;
  20. CCP1M1=0;
  21. CCP1M0=0;
  22. TMR2ON=1;
  23. }
  24. void InitBPWM()
  25. {   
  26. TRISC1=0;//RC2作为PWM模式输出引脚
  27. T2CKPS1=0;
  28. T2CKPS0=0;//TMR2预分频比为1:1,且使能TMR2模块
  29. PR2=249;
  30. CCPR2L=((uint8)(wide>>2))&0x0FF;
  31. if((((uint8)(wide>>1))&0x01)==1) CCP2X=1;
  32. else CCP2X=0;
  33. if((((uint8)wide)&0x01)==1) CCP2Y=1;
  34. else CCP2Y=0;
  35. CCP2M3=1;
  36. CCP2M2=1;
  37. CCP2M1=0;
  38. CCP2M0=0;
  39. TMR2ON=1;
  40. }

  41. void interrupt ISR(void)  //定时中断服务程序
  42. {

  43. double rOut;
  44. double rIn;
  45. if(T0IF==1)
  46. {

  47.   T0IF=0;               //清空标志

  48. g_ACC++;
  49. if(g_ACC==500)         //等于500说明1s了
  50. {
  51.    RB4=~bFlag;          //RB2口求反
  52.    bFlag=RB4;
  53.    g_ACC=0;             //累加器清零
  54. //EEPROM_Write(0x00,(uint8)spid.Proportion);//写0x00地址
  55. //EEPROM_Write(0x01,(uint8)spid.Integral);  //写0x01地址
  56. //EEPROM_Write(0x02,(uint8)spid.Derivative);//写0x02地址
  57. //EEPROM_Write(0x00,0x55);
  58. //EEPROM_Write(0x01,0x11);
  59. //EEPROM_Write(0x02,0x22);

  60. }
  61.    ADGO=1;               //启动AD转换
  62. while(ADGO){}
  63. torque=0;
  64.   torque=(((uint16)ADRESH)<<8)+ADRESL; //获得十位转换结果
  65.   //spid.Setpoint=(double)torque;   //r(t)
  66.   //ADC2_Init();
  67.   //ADGO=1;               //启动AD转换
  68.   //while(ADGO){}
  69.   //current=(((uint16)ADRESH)<<8)+ADRESL; //获得十位转换结果
  70.   //rOut=(double)current;            //y(t)
  71.   //rIn=PIDCalc (&spid,rOut); //u(t)

  72.   if(torque<=(512-10))//电机反转
  73.   {
  74.    uint16 motor_left=0;
  75.    motor_left=512-10-torque;  
  76.    wide=(uint16)((long)motor_left*1000/502);
  77.    InitAPWM();
  78.    wide=0;
  79.    InitBPWM();
  80.   }
  81.   
  82.   else if(torque>=(512+10))//电机正转
  83.   {
  84.    uint16 motor_right=0;
  85.    motor_right=torque-512-10;  
  86.    wide=(uint16)((long)motor_right*1000/502);
  87.    InitBPWM();
  88.    wide=0;
  89.    InitAPWM();
  90.   }
  91.   
  92.   else//电机停止
  93.   {
  94.    wide=0;
  95.    InitAPWM();
  96.    InitBPWM();
  97.   }

  98. }




  99. }


部分代码
NE5532 发表于 2012-9-24 21:24 | 显示全部楼层
先把程序砍开,用串口之类的输出转矩测量数据,将整个转矩工作范围砍成N个线性区间,施加这些数值的转矩,并记录数据,绘制曲线观察其是否线性,再通过测试程序模拟N个点的PWM输出,同上测试,即可找到真相。

基本原理:要善于把复杂系统划分为模块进行调试,不要胡子眉毛一把抓。
 楼主| 609044735 发表于 2012-9-25 09:23 | 显示全部楼层
谢谢,已经找到问题了。是A/D的配置位除了问题,改为自带的RC就没有问题了
兰天白云 发表于 2012-9-25 14:46 | 显示全部楼层
谢谢,已经找到问题了。是A/D的配置位除了问题,改为自带的RC就没有问题了
609044735 发表于 2012-9-25 09:23

真正原因还为找到吧
 楼主| 609044735 发表于 2012-9-27 17:04 | 显示全部楼层
是的,不知道为什么会这样
兰天白云 发表于 2012-9-28 13:39 | 显示全部楼层
AD的采样时间是有规定的,太短了肯定不行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部