初级会员

- 积分
- 147
- 金钱
- 147
- 注册时间
- 2017-4-28
- 在线时间
- 44 小时
|
10金钱
使用芯片 为:stm32f103zet6
现在用 2个普通的 io,利用电频翻转,实现一个2路的脉冲,需要根据速度的变化,生成不同的脉冲信号,需要通道1 与通道2 相差四分之一个相位。
想在我用了俩种方法:一:使用通用定时器,设置一个定时器溢出时间,定时器中进行记数。 根据不同的速度 生成不同的翻转时间。ch2 比ch1开始时间多四分一的翻转周期。
完成一轮的翻转,ch2的周期就与ch1相同了。
二、与方法一相同,使用通用定时器。但是通过改变 定时器的重装载值。改变脉冲的周期。
但是现在这两种方法,固定的输出一种脉冲,是可以的。但是如果实时变化,就会出现问题。如:ch1、ch2的相位就变了。频率输出也有问题了。
不知道大佬们还有其他方法没有?或者我这种方式有什么缺陷。
下面是我的代码 方法二:
void SpeedSet(void)
{
float freq1,tmp;
u32 cycle1,cycle2;
speed_str.delay_star=0;
if(0 == speed_str.Diameter)
{
speed_str.Diameter = 840;
}
freq1=(float)(speed_str.speed1*200/(3.14*speed_str.Diameter/10));
if(freq1>0)
{
cycle1=1000000/freq1/4;
TIM6->ARR=cycle1;
}else if(!freq1)
TIM6->ARR=100;
if(!speed_str.init_zero)
{
speed_str.tim1_ch1_count=0;
speed_str.tim1_ch2_count=0;
speed_str.init_zero=1;
}
}
void speedput(void)//在定时器中断中运行
{
if(speed_str.speedsetEN==1)
{
if(speed_str.tim1_ch1_count>=(speed_str.cycle1+speed_str.tim1_delay_time))
{
if(speed_str.gpio1_on==0)
{
GPIOE->ODR |= GPIO_Pin_10;
GPIOE->ODR |= GPIO_Pin_12;
speed_str.gpio1_on=1;
}else
{
GPIOE->ODR &= (~GPIO_Pin_10);
GPIOE->ODR &= (~GPIO_Pin_12);
speed_str.gpio1_on=0;
}
speed_str.tim1_ch1_count=0;
speed_str.tim1_delay_time=0;
}
if(speed_str.tim1_ch2_count>=(speed_str.cycle1+speed_str.tim2_delay_time))
{
if(speed_str.gpio2_on==0)
{
GPIOE->ODR |= GPIO_Pin_11;
GPIOE->ODR |= GPIO_Pin_13;
speed_str.gpio2_on=1;
}else
{
GPIOE->ODR &= (~GPIO_Pin_11);
GPIOE->ODR &= (~GPIO_Pin_13);
speed_str.gpio2_on=0;
}
speed_str.tim1_ch2_count=0;
speed_str.tim2_delay_time=0;
}
}
else
{
GPIOE->ODR &= (~GPIO_Pin_10);
GPIOE->ODR &= (~GPIO_Pin_11);
GPIOE->ODR &= (~GPIO_Pin_12);
GPIOE->ODR &= (~GPIO_Pin_13);
}
}
|
|