OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8320|回复: 14

新手学stm32,正在看原子老师的视频学习。但最近遇到一个有关定时器和电机测速的瓶颈,希望大家帮帮我

[复制链接]

2

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-7-17 12:32:06 | 显示全部楼层 |阅读模式
    我最近看了PWM输出的那个实验,所以想自己做一个简单的电机测速并最后将速度显示在LCD上。电机用的是普通的直流电机,码盘用的是一个二十孔码盘。现在我的问题是:定时器不知道该如何使用才能实现脉冲计数和一秒时间定时和pwm调速不发生冲突?之前我尝试用两个通用定时器和一个外部中断来编写代码,两个通用定时器,一个用作1S定时,一个用作pwm调速,外部中断用作测速码盘产生的脉冲计数。但下到战舰学习板上却不能实现。感觉像是中断有冲突了。希望大家给我点意见~谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-2-22
在线时间
0 小时
发表于 2014-9-15 13:19:13 | 显示全部楼层
用外部中断的方法,总是触发中断,是不是对整个程序有影响啊!
回复 支持 1 反对 0

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2013-7-16
在线时间
0 小时
发表于 2013-7-17 13:28:25 | 显示全部楼层
定时器用TIME4 PWM输出的用TIME3就好了
例程好像都是用TIME3的 改一下就好了。
晴喧o(︶︿︶)o
回复 支持 反对

使用道具 举报

2

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-7-17
在线时间
0 小时
 楼主| 发表于 2013-7-17 13:34:01 | 显示全部楼层
回复【2楼】慧(^o^)/羽:
---------------------------------
嗯,我之前试过了,不过貌似产生了冲突,在原来的TIM3作调速的基础上,加上TIM4作定时之后,TIM3却不工作了(电机不跑了)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-7-17 13:59:46 | 显示全部楼层
回复【3楼】zqdhls:
---------------------------------
检查代码,TIM3,TIM4是可以独立工作的,不应该互相影响才对.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2013-7-16
在线时间
0 小时
发表于 2013-7-17 14:00:41 | 显示全部楼层
不会的呀! 这个电机控制调速的实验我做过。是不是你把TIME4开了之后忘记开了TIME3了呢?
给你看下我的main函数 和 time里面的函数吧
main()的部分
int main(void)
{
    u8 start=0;
  Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化
uart_init(72,9600);  //串口初始化 
LED_Init();   //初始化与LED连接的硬件接口
KEY_Init();
EXTIX_Init();
LCD_Init();
Timerx_Init(10000,7199);
PWM_Init(900,0); //不分频。PWM频率=72000/900=8Khz
    GPIOA->CRH&=0XFFF00FFF; 
GPIOA->CRH|=0X00033000;//PA11 推挽输出    
    GPIOA->ODR|=1<<11;      //PA11 输出高
GPIOA->ODR&=~(1<<12);      //PA12 输出低
    while(1)
{
  delay_ms(300);
if(srate>40) //实际转速不大于40
 srate-=30;
if(shezhi==1)
{
  if(rate>(srate*2))//霍尔元件测得的速度比较
  led0pwmval-=5;
  if(rate==(srate*2))
  {
  led0pwmval=led0pwmval;
  shezhi=0;
  end=1;
  }
  if(rate<(srate*2))
  led0pwmval+=5;
  }
  if(end!=1)
LCD_ShowNum(60,150,srate,5,16);
LCD_ShowNum(60,180,rate/2,5,16);
if (complete==1)
{
 if(end==1)
 {
 LCD_Fill(60,150,200,1700,WHITE);
 LCD_ShowString(60,150,"OK");
 LCD_ShowNum(60,180,rate/2,5,16);
 }

complete=0;
}
         
LED0_PWM_VAL1=led0pwmval;
LED0_PWM_VAL2=led0pwmval;
if (start==0)//初始化
{     
GPIOA->CRL&=0X00FFFFFF;//PA7输出
GPIOA->CRL|=0X3B000000;//推免输出    
        GPIOA->ODR&=~(1<<7);      //PA6 输出低
start=1;
}   
}
time.c部分
定时器
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2;//TIM4时钟使能    
  TIM4->ARR=arr;  //设定计数器自动重装值//刚好1ms    
TIM4->SC=psc;  //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM4->DIER|=1<<0;   //允许更新中断
TIM4->DIER|=1<<6;   //允许触发中断
     
TIM4->CR1|=0x01;    //使能定时器3
  MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2  
}
void PWM_Init(u16 arr,u16 psc)
{  
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1;       //TIM3时钟使能    

GPIOA->CRH&=0XFFFFFFF0;//PA8输出
GPIOA->CRH|=0X00000004;//浮空输入
 
GPIOA->CRL&=0X00FFFFFF;//PA7输出
GPIOA->CRL|=0XBB000000;//复用功能输出  
GPIOA->ODR|=1<<7;//PA7上拉
    GPIOA->ODR|=1<<6;//PA7上拉

TIM3->ARR=arr;//设定计数器自动重装值 
TIM3->SC=psc;//预分频器不分频
TIM3->CCMR1|=7<<12;  //CH2 PWM2模式  
TIM3->CCMR1|=1<<11; //CH2预装载使能
TIM3->CCMR1|=7<<4;  //CH2 PWM2模式  
TIM3->CCMR1|=1<<3; //CH2预装载使能   

TIM3->CCER|=1<<4;   //OC2 输出使能
TIM3->CCER|=1<<0;   //OC2 输出使能   

TIM3->CR1=0x8000;   //ARPE使能 
TIM3->CR1|=0x01;    //使能定时器3  


修改速度的只要改led0pwmval就好了,至于GPIOA11和12 不用管这是我用在驱动电路上的

晴喧o(︶︿︶)o
回复 支持 反对

使用道具 举报

2

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-7-17
在线时间
0 小时
 楼主| 发表于 2013-7-17 14:48:28 | 显示全部楼层
回复【5楼】慧(^o^)/羽:
---------------------------------
谢谢~不过我是从库函数开始学的stm32,所以需要一点时间来消化你的程序:)
另外,能不能把你的EXTIX_Init()计数脉冲的代码也贴上来呢?让我能整体地检查检查我的代码。再次谢谢了~
回复 支持 反对

使用道具 举报

2

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-7-17
在线时间
0 小时
 楼主| 发表于 2013-7-17 14:48:50 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
嗯。谢谢原子老师。正在检查中。。。
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2013-7-16
在线时间
0 小时
发表于 2013-7-17 16:39:08 | 显示全部楼层
外部计数的的代码也很简单的,如下:
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2;     //使能PORTA时钟
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD   

GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入  
GPIOA->CRL|=0X00000008;  
GPIOA->CRL&=0XFFFFFF0F;//PA1设置成输入   这里是外部中断的I/O设置  
GPIOA->CRL|=0X00000080; 
GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入  
GPIOA->CRH|=0X80800000;   
GPIOA->ODR|=1<<13;   //PA13上拉,PA0默认下拉
GPIOA->ODR|=1<<15;   //PA15上拉

Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发
Ex_NVIC_Config(GPIO_A,1,FTIR); //下降沿触发//外部计数的中断触发
Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发
Ex_NVIC_Config(GPIO_A,15,FTIR);//下降沿触发

MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);    //抢占2,子优先级2,组2
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2
MY_NVIC_Init(2,3,EXTI1_IRQChannel,2);//抢占2,子优先级3,组2  外部中断的中断设置

中断服务函数:
void EXTI1_IRQHandler(void)
{
circle++; 
EXTI->R=1<<1;     //清除LINE1上的中断标志位  
}
当然如果你还想计数下高电平的时间的话,只要结合定时器中断就很容易做到了。

晴喧o(︶︿︶)o
回复 支持 反对

使用道具 举报

2

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-7-17
在线时间
0 小时
 楼主| 发表于 2013-7-17 16:51:42 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
回复【5楼】慧(^o^)/羽:
---------------------------------
非常感谢原子哥和这位慧羽同学,我刚才对比慧羽同学给的代码发现我的定时器4的设置里确实少了一个关于中断触发的配置。现在已改正。
回复 支持 反对

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-6-17
在线时间
7 小时
发表于 2013-7-24 19:02:19 | 显示全部楼层
请问你码盘用外部中断测得准么??貌似我的测得不是很准确!!!!
回复 支持 反对

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2013-7-15
在线时间
0 小时
发表于 2013-7-25 13:42:41 | 显示全部楼层
回复【10楼】ljh407055315:
---------------------------------
电机转动时对信号的干扰很大,会导致测得不准。
回复 支持 反对

使用道具 举报

13

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2013-9-24
在线时间
74 小时
发表于 2013-12-15 15:12:16 | 显示全部楼层
回复【9楼】zqdhls:
--------------------------------亲,我看看你的代码吧《《》》::“
回复 支持 反对

使用道具 举报

8

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2013-7-13
在线时间
24 小时
发表于 2014-4-15 18:31:43 | 显示全部楼层
回复【11楼】lichaoya:
回复【10楼】ljh407055315: --------------------------------- 电机转动时对信号的干扰很大,会导致测得不准。
---------------------------------
电机驱动如果加了光耦隔离之后测速会不会好点?
。。。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-8-2
在线时间
0 小时
发表于 2019-8-2 17:27:10 | 显示全部楼层
我也学习这个,请问可以参考一下你的代码吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-30 19:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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