好像不能像PIC某些带运动反馈检测的单片机一样,可以直接通过硬件得到高电平时间
STM32最好是通过两个中断+一个定时器来做
一个上升沿触发中断:开启定时与下降沿中断
下降沿中断到来时,捕捉定时器计数,得到高电平时间
下一个上升沿到来时,捕捉定时器计数,得到周期
这个思路应该是可以的实现的,反正STM32中断也多,
首先,STC8H不需要外部晶振和外部复位,也可以外接。它的时钟4M-36M。和其它stc芯片的区别是它的运行速度够快,8路16位的高级pwm定时器,4路可以输出互补的脉冲信号,在用这个芯片的时候我发现手册上有些地方讲的不是太清楚,对照了32的手册才明白了原理,今天着重说一下高级定时器的那部分。
STC8H 系列的单片机内部集成了 8 通道 16 位高级 PWM 定时器,分成两组周期可不同的 PWM,分别命名为 PWMA 和 PWMB可分别单独设置。第一组 PWM/PWMA 可配置成 4 组互补/对称/死区控制的 PWM 或捕捉外部信号,第二组 PWM/PWMB 可配置成 4 路 PWM 输出或捕捉外部信号。
pwmA可配置成输出比较,输入捕获以及pwm模式,pwm有边沿对齐以及中间对齐模式,可直接驱动一些小型的电机,在驱动一些小型的电机时一定要将相应的io口配成推挽输出在,不然驱动不起来,具体的原理就不写了,主要说一下主要寄存器以及主要模式的配置。
选择计数器时钟(内部、外部或者预分频器(PSCR)),我用的都是内部。
预分频器看你想要输出的频率范围自己设置
2 将相应的数据写入 PWMA_ARR(设频率) 和 PWMA_CCRi (设占空比)寄存器中。频率=时钟/(PSCR+1)/(ARR+1)
3 如果要产生一个中断请求,设置 CCiIE 位,在中断判断SR1状态位,PWMA和PWMB不是一个中断号。
4 选择输出模式步骤:
1 设置 OCiM=011,在计数器与 CCRi 匹配时翻转 OCiM 管脚的输出
2 设置 OCiPE = 0,禁用预装载寄存器
3 设置 CCiP = 0,选择高电平为有效电平,开始输出高电平。
4 设置 CCiE = 1,使能输出
5 设置 PWMA_CR1 寄存器的 CEN 位来启动计数器。
输入捕获配置:
先设置PSCR,根据你的所测频率范围来设数据。设ARR一般为最大值
1选择有效输入端,设置 PWMA_CCMR1 寄存器中的 CC1S=01,此时通道被配置为输入,并且PWMA_CCR1 寄存器变为只读。
2 根据输入信号 TIi 的特点,可通过配置 PWMA_CCMR1 寄存器中的 IC1F 位来设置相应的输入滤波器的滤波时间。假设输入信号在最多 5 个时钟周期的时间内抖动,我们须配置滤波器的带宽长于 5 个时钟周期;因此我们可以连续采样 8 次,以确认在 TI1 上一次真实的边沿变换,即在PWMA_CCMR1 寄存器中写入 IC1F=0011,此时,只有连续采样到 8 个相同的 TI1 信号,信号才为有效(采样频率为 fMASTER)。
3 选择 TI1 通道的有效转换边沿,在 PWMA_CCER1 寄存器中写入 CC1P=0(上升沿)。
4 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写 PWMA_CCMR1 寄存器的 IC1PS=00)。
5 设置 PWMA_CCER1 寄存器的 CC1E=1,允许捕获计数器的值到捕获寄存器中。
6 如果需要,通过设置
PWMA_IER 寄存器中的 CC1IE 位允许相关中断请求。
7使能计数器设置 PWMA_CR1 寄存器的 CEN 位来启动计数器。
#define TEST_IN PA0 //要测试的信号
#define F_TEST_IN PA1 //要测试信号的反向,加一个反向门得到的
main()
{
unsigned long low_cnt,high_cnt;
while(1)
{
while(TEST_IN); //确保TEST_IN = 0;
low_cnt = 0;
high_cnt = 0;
while(!TEST_IN); //确保TEST_IN = 1;
while(TEST_IN) high_cnt++; //计算高电平数量
while(F_TEST_IN) low_cnt++; //计算低电平数量
//以下添加其他的处理代码。
}
}
这个应该能够保证到精度。十分浪费CPU时间就是。但是如果只有这一个任务还是OK的。
你说的用外部中断的方法也可以。
思路1 采用timer来进行计数。遇到相应的边沿后中断,停计数器。然后进行相应的处理。
思路2 直接用循环来检测,当然如果这个地方用循环检查的话,不如就不用中断了,直接用软件来实现上升沿下降沿的识别。也就是我写的程序一样了。
提示,思路1的话明显的会觉得有点问题。因为是硬件计数。至于精度问题,你看下程序就可以感觉出来。还有精度主要取决于检测的始终。与中断什么的没有任何关系。只是用中断给人感觉比较实时。
你的第二个想法有点看不懂。如果说你是想用AD转换来进行占空比的分析的话,那太笨了。根本就是自找麻烦。
我觉得可以把PWM信号读入I/O口,定义两个变量,一个high表示高电平,一个low表示低电平,遇到第一个上升沿开始给high+1,遇到第一个下降沿给low+1,遇到第二个上升沿,则停止计数。统计high与low,就可以知道一个周期内,占空比。
以上就是关于求一个可以在STM32F103VET6上运行的捕获占空比的程序。最好能够利用一个管脚发送PWM信号,另外一个进行捕获全部的内容,包括:求一个可以在STM32F103VET6上运行的捕获占空比的程序。最好能够利用一个管脚发送PWM信号,另外一个进行捕获、stc8h单片机如何设置pwm频率、如何用单片机捕捉PWM占空比等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)