初级会员

- 积分
- 60
- 金钱
- 60
- 注册时间
- 2017-2-20
- 在线时间
- 9 小时
|
发表于 2017-5-20 13:30:47
|
显示全部楼层
我最近想了如下方法:
1.基于原子的PWM教程,使用定时器产生pwm波形
2.使用软件读取ssi的电平,可以做到任意位数,如下
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
u8 i=63;
uint64_t data=0;
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
LED_Init();
delay_init(168); //延时初始化
KEY_Init();
TIM14_PWM_Init(21-1,2-1); //84Mhz的计数频率,2Mhz的PWM.
LED1=0;
while(1)
{
LED0_PWM_VAL=0; //此时脉冲的占空比是0,那么就全是高电平
delay_ms(1);
LED0_PWM_VAL=15; // 此时来脉冲,占空比是1/3 如果LED0_PWM_VAL=10; 占空比是1/2
for (i=63;i>0;) // 此时暂定脉冲个数是64个
{
while(1)
{
if (KEY0==1) //将pwm的输出,即LED0,接到key0上
{
data|=(1<<i);
LED1=!LED1;
break;
}
}
while(1)
{
if (KEY0==0)
{
break;
}
}
i--;
}
}
}
其实原理很简单,将pwm的输出作为SSI的clk信号,同时将clk信号与arm的某一个pin短路,那么通过软件来寻找下降沿,当下降沿的时候,将数据采集进来。
1. 这个实验是基于ALIENTEK板子的
2.使用的是原子的pwm例程
3. 需要注意 在led.h 和led..c中,去掉了PF10的定义。因为原子的pwm例程使用的是PF10
4.为了验证采集,我将PE4和PF9短路,然后通过控制LED1的翻转来观察是否采集到了有效信号。
5. 可以看到,LED1的翻转的时候,pwm输出依然在高电平(此时模拟的是上升沿釆数),证明采集有效
波形附件,黄线是pwm,绿线是LED1的信号
|
|