找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

26万转:用最短代码,转最快电机

  [复制链接]
楼主
冰破 发表于 2016-10-25 10:21:04 | 显示全部楼层
这套代码对应的demo板子有出售的吗? 板子烧进demo代码后能直接把电机运转起来的那种
回复 支持 反对

使用道具 举报

沙发
冰破 发表于 2016-10-26 08:25:29 | 显示全部楼层
Angus 发表于 2016-10-25 14:24
做过两批板子,全送光了,今年没再做。

反电势比较器的输入端,电路图上是P3.1  P3.4 P3.5,但是代码里边是
#define   ACMP_PH_A                CMP1_PIN_P32               
#define   ACMP_PH_B                CMP1_PIN_P34               
#define   ACMP_PH_C                CMP1_PIN_P35   

两者不对应,何解?
回复 支持 反对

使用道具 举报

板凳
冰破 发表于 2016-10-26 10:16:04 | 显示全部楼层
Angus 发表于 2016-10-26 09:23
P3.1,P3.2,P3.4,P3.5 这四个引脚都是比较器1的输入,任选三就可以,代码上改一下定义即可。
P3.1 即可 ...

了解,那10月份更新的这份代码,这份代码对应的电路图能给我一份参考吗?   图不对码看的很辛苦。
304080523@qq.com

10-28 的苏州研讨会我会去参加,你会过去吗?
回复 支持 反对

使用道具 举报

地板
冰破 发表于 2016-10-26 14:21:20 | 显示全部楼层
Angus 发表于 2016-10-26 14:11
苏州研讨会我会去的。
我是连线测试的,没有用绘图软件做成一个文件。
我上传的这些个原理图更合理,软件 ...

PWM->PHCHGMASK =  PHCHG_CTL_CMP1 | P01_OUT_D6 | P00_OUT_D7 ;        

P01和P00用PWM输出模块输出值,用意是什么?  
我手上的硬件,p00和P01用作了串口,那这两个我可以直接关掉了是吗?
回复 支持 反对

使用道具 举报

5#
冰破 发表于 2016-10-26 15:03:28 | 显示全部楼层
PWM024_0_MOS_On() ;                 // PWM024 输出低时 MOS 导通,调用此函数让输出反相     
  PWM135_1_MOS_On() ;                 // PWM135 输出高时 MOS 导通,调用此函数让输出反相

如果代码中把这两行MARK掉,TabPhase对应的电路是上桥臂PWM024高电平导通,下桥臂PWM135低电平导通吗?
回复 支持 反对

使用道具 举报

6#
冰破 发表于 2016-10-27 09:21:52 | 显示全部楼层
计算周期的时候,定时器计到了最大值,然后从0再开始,这时读出来的TIMER1->DR会比上一次的值小,这时候计算周期的公式还是正确的吗?

例如 上一次的值ZeroTick为0xFFFF00, 到了这次过零,TIMER1->DR已经从最小重新开始数了,变成了0x0000FF, 那下面计算还能得到正确的周期值吗?

PeriodLast = (TIMER1->DR - ZeroTick) & 0xFFFFFF ;
回复 支持 反对

使用道具 举报

7#
冰破 发表于 2016-10-27 10:52:13 | 显示全部楼层
关于TIMER0的配置和使用,我有点疑问

code中这么初始化的:
TIMER0->CSR   =  T_CRST | T_MODE_PERIODIC   | T_WR_TCMP_NO_RST | T_TDR_EN + 21 ;
所以更新timer0的CMP寄存器时,只要当TCMP <= TDR时才会重新从0开始计数
Periodic Mode Behavior Selection
0 = In One-shot or Periodic mode, when write new TCMP, timer counter will reset.
1 = In One-shot or Periodic mode, when write new TCMP if new TCMP > TDR(current
counter) , timer counter keep counting and will not reset. If new TCMP <= TDR(current
counter) , timer counter will reset.



再看运用:
void TMR1_IRQHandler(void)                                    
{  
  uint32_t  PeriodLast ;


  TIMER0->CMPR = ~0 ;          //     ~0 is 0xFFFFFFFF                     
  TIMER1->ISR  = ~0 ;                                           // Clear all interrupt flag
  ZeroDeadline = PeriodNow << 1 ;
  do{
    if((*pPhase) & DetectUpBit){                                                                                          
      if(ACMP->SR & AcmpOutBit){ ++StepCount; break; }           // up zero      
    }
    else{                                                                                                                 
      if((ACMP->SR & AcmpOutBit)==0){ ++StepCount; break; }      // down zero                     
    }
  }while(TIMER0->DR < ZeroDeadline) ;   
  PeriodLast = (TIMER1->DR - ZeroTick) & 0xFFFFFF ;



这里ZeroDeadline 的值是周期的一半,按while条件中的比较,TIMER0->DR从0开始计数才是合理的,但是前面TIMER0->CMPR赋予的是最大值,所以定时器0不会RST,
TIMER0->DR不会从0开始计数。这个while的延时条件是有问题的。




================================
我认为应该这么做:
只要更新TIMER0->CMPR值,就会重新从0开始计数
TIMER0->CSR   =  T_CRST | T_MODE_PERIODIC  | T_TDR_EN + 21 ;  

然后再修改一处地方:
  if(PeriodNow > PeriodMax) PeriodNow = PeriodMax ;  
  TIMER0->CMPR = TIMER0->DR + ((PeriodNow*PhaseAngle) >> 6) ;    // Set TIMER0 period
  TIMER1->CMPR = TIMER1->DR + ((PeriodNow*3)>>2) ;               // Set TIMER1 interrupt
修改成:
  if(PeriodNow > PeriodMax) PeriodNow = PeriodMax ;  
  TIMER0->CMPR = ((PeriodNow*PhaseAngle) >> 6) ;    // Set TIMER0 period
  TIMER1->CMPR = TIMER1->DR + ((PeriodNow*3)>>2) ;               // Set TIMER1 interrupt


回复 支持 反对

使用道具 举报

8#
冰破 发表于 2016-10-27 15:52:20 | 显示全部楼层
Angus 发表于 2016-10-27 14:25
善于思考是个好习惯。
你手头有板子,也有代码,你可以验证一下你的思路是否正确,看看电机能否正常转 ...

能先告诉我答案吗? 我的分析是否正确。

我手上的板子不是按那个电路图来的。我目前的阶段是理解你的代码以后,再摘取有用的部分移植进我的BLDC代码中。我自己有成熟代码,不过是基于STM32的
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU