多路脉冲输出,有没有什么更好的方案?

2019-07-21 02:39发布




如上图要输出两路脉冲,A,B信号是用来做检测用的,C信号会被扩大成大电流,然后释放能量(电火花)。ABC信号周期相同。其中AB信号高电平时常不可调,A和C同时上升,B信号提前1us上升(即在B下降时,AC上升)。 C信号的高低电平可调,比如图中高电平30us,低电平35us,可能会根据参数调整为高电平22us,低电平90us。并且C信号的周期长度决定了AB信号的周期长度。
本来只有1路,现在想提高电路利用率,增加一路信号输出,其中新增信号的C与原有的C互补,并且新增C的高电平中心要对齐原有C的低电平中心(为了做电源时域负载平衡)。
我现在的方案是用一个定时器输出1路信号,然后等待一定时间之后开启另外一个定时器输出第二路信号。问题是第二路信号的延迟时间似乎误差挺大(300ns~800ns),有没有什么办法使得这个误差保持在100ns以下??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
mack13013
1楼-- · 2019-07-21 06:21
 精彩回答 2  元偷偷看……
mack13013
2楼-- · 2019-07-21 09:16
呃,参考手册上说CNT固定从0开始。。。
mack13013
3楼-- · 2019-07-21 13:11

有谁知道如何使用一个定时器去启动另外一个定时器吗?

比如使用TIM8去启动TIM1。

我按照参考手册上说的去操作,没有成功,TIM1没有被开启



下面是参考手册上的节选

使用一个定时器启动另一个定时器
本例中使用定时器 1 的更新事件使能定时器 2。相关连接图,请参见图 159。只要定时器 1 生成更新事件,定时器 2 便根据分频后的内部时钟从当前值(可以不为 0)开始计数。定时 器 2 收到触发信号时,其 CEN 位自动置 1,并且计数器开始计数,直到向 TIM2_CR1 寄存 器的 CEN 位写入“0”后停止计数。两个计数器的时钟频率都基于 CK_INT 通过预分频器执 行 3 分频 (fCK_CNT = fCK_INT/3)。
● 将定时器 1 配置为主模式,发送其更新事件 (UEV) 作为触发输出(TIM1_CR2 寄存器
中的 MMS=010)。
● 配置定时器 1 的周期(TIM1_ARR 寄存器)。
● 配置定时器 2 以接收来自定时器 1 的输入触发(TIM2_SMCR 寄存器中的 TS=000)。
● 将定时器 2 配置为触发模式(TIM2_SMCR 寄存器中的 SMS=110)。
● 通过向 CEN 位(TIM1_CR1 寄存器)写入“1”启动定时器 1。



下面是我的程序;;

[mw_shl_code=c,true] void PulseGeneratorsPeremetersSet(u16 uwOnTimeUs, u16 uwOffTimeUs) { u32 unArr; u16 uwCcr1, uwCcr2, uwCcr3, uwCcr4; uwCcr1 = 4; //2us uwCcr4 = uwOffTimeUs + uwOnTimeUs; //middle unArr = uwCcr4 * 2; uwCcr2 = uwOnTimeUs * 2; //spark uwCcr3 = (uwOffTimeUs + uwOnTimeUs - 1) * 2; //1us ahead RCC ->APB2ENR |= 3 << 0; //使能TIM1 TIM8时钟 RCC ->AHB1ENR |= 1 << 2; //使能PortC时钟 RCC ->AHB1ENR |= 1 << 6; //使能PortE时钟 GPIO_Set(GPIOC, PIN6 | PIN7 | PIN8 | PIN9, GPIO_MODE_AF, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PU); //复用, 输出,上拉 GPIO_Set(GPIOE, PIN9 | PIN11 | PIN13 | PIN14, GPIO_MODE_AF, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PU); //复用, 输出,上拉 //PC6、7、8、9复用为TIM8的CH1、2、3、4 GPIO_AF_Set(GPIOC, 6, 3); GPIO_AF_Set(GPIOC, 7, 3); GPIO_AF_Set(GPIOC, 8, 3); GPIO_AF_Set(GPIOC, 9, 3); //PE9、11、13、14复用为TIM1的CH1、2、3、4 GPIO_AF_Set(GPIOE, 9, 1); GPIO_AF_Set(GPIOE, 11, 1); GPIO_AF_Set(GPIOE, 13, 1); GPIO_AF_Set(GPIOE, 14, 1); TIM1 ->ARR = unArr; //自动装填值,该值与分频数决定PWM的周期长度(从而也确定频率) TIM8 ->ARR = unArr; //自动装填值,该值与分频数决定PWM的周期长度(从而也确定频率) TIM1 ->SC = 84 - 1; //分频器。经过unPsc个TIM1的周期后,TIM1的CNT计数器加1,CNT的数值达到unArr后,产生中断或者事件,然后从0开始计数 每个CNT为0.5us TIM8 ->SC = 84 - 1; //分频器。经过unPsc个TIM8的周期后,TIM8的CNT计数器加1,CNT的数值达到unArr后,产生中断或者事件,然后从0开始计数 每个CNT为0.5us TIM1 ->CCMR1 |= 6 << 4; //CH1 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定 TIM1 ->CCMR1 |= 6 << 12; //CH2 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定 TIM1 ->CCMR2 |= 6 << 4; //CH3 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定 TIM1 ->CCMR2 |= 6 << 12; //CH4 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定 TIM8 ->CCMR1 |= 6 << 4; //CH1 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定 TIM8 ->CCMR1 |= 6 << 12; //CH2 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定 TIM8 ->CCMR2 |= 6 << 4; //CH3 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定 TIM8 ->CCMR2 |= 6 << 12; //CH4 PWM模式1 先有效电平后无效电平 有效电平、无效电平是高还是低,由CCER的CCxP位决定 TIM1 ->CCMR1 |= 1 << 3; //CH1 预装载使能 TIM1 ->CCMR1 |= 1 << 11; //CH2 预装载使能 TIM1 ->CCMR2 |= 1 << 3; //CH3 预装载使能 TIM1 ->CCMR2 |= 1 << 11; //CH4 预装载使能 TIM8 ->CCMR1 |= 1 << 3; //CH1 预装载使能 TIM8 ->CCMR1 |= 1 << 11; //CH2 预装载使能 TIM8 ->CCMR2 |= 1 << 3; //CH3 预装载使能 TIM8 ->CCMR2 |= 1 << 11; //CH4 预装载使能 TIM1 ->CCER |= 1 << 0; //OC1输出使能 TIM1 ->CCER |= 1 << 4; //OC2输出使能 TIM1 ->CCER |= 1 << 8; //OC3输出使能 TIM1 ->CCER |= 1 << 12; //OC4输出使能 TIM8 ->CCER |= 1 << 0; //OC1输出使能 TIM8 ->CCER |= 1 << 4; //OC2输出使能 TIM8 ->CCER |= 1 << 8; //OC3输出使能 TIM8 ->CCER |= 1 << 12; //OC4输出使能 TIM1 ->CCER &= ~(1 << 1); //OC1高电平有效 TIM1 ->CCER &= ~(1 << 5); //OC2高电平有效 TIM1 ->CCER |= 1 << 9; //OC3低电平有效 TIM1 ->CCER &= ~(1 << 13); //OC4高电平有效 TIM8 ->CCER &= ~(1 << 1); //OC1高电平有效 TIM8 ->CCER &= ~(1 << 5); //OC2高电平有效 TIM8 ->CCER |= 1 << 9; //OC3低电平有效 TIM8 ->CCER &= ~(1 << 13); //OC4高电平有效 //设置捕获值 TIM1 ->CCR1 = uwCcr1; TIM1 ->CCR2 = uwCcr2; TIM1 ->CCR3 = uwCcr3; TIM1 ->CCR4 = uwCcr4; //设置捕获值 TIM8 ->CCR1 = uwCcr1; TIM8 ->CCR2 = uwCcr2; TIM8 ->CCR3 = uwCcr3; TIM8 ->CCR4 = uwCcr4; TIM1 ->CR1 |= 1 << 7; //ARR寄存器缓冲 TIM1 ->BDTR |= 1 << 15; //MOE = 1 TIM8 ->CR1 |= 1 << 7; //ARR寄存器缓冲 TIM8 ->BDTR |= 1 << 15; //MOE = 1 TIM8 ->SMCR |= 1 << 7; //主模式 //设定更新输出 TIM8 ->CR2 &= ~(7 < 4); TIM8 ->CR2 |= 2 << 4; TIM1 ->SMCR &= ~(7 << 4); //TRG0触发,注意TS的更改要先于SMS //触发模式 TIM1 ->SMCR &= ~(7 << 0); TIM1 ->SMCR |= 7 << 0; TIM8 ->CNT = 0; TIM1 ->CNT = uwOffTimeUs + uwOnTimeUs - 4; } //成功返回0 u8 PulseOutputStart(void) { TIM8 ->CR1 |= 1 << 0; //使能定时器8,输出pulse1 return 0; }[/mw_shl_code]


正点原子
4楼-- · 2019-07-21 14:57
 精彩回答 2  元偷偷看……

一周热门 更多>