打印

STM32输出us级的方波

[复制链接]
3940|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本人刚从51转STM32,问题比较浅显,各位大神见笑了
现在公司做项目,想做一个脉宽和占空比可调的脉冲,目前卡在了1us的脉宽上,使用GPIO_SetBits这个库函数本身调用就需要1us,但是直接对寄存器操作好像也节省不了多少时间。
现贴出程序如下:
static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
void delay_init(u8 SYSCLK)
{
        SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8
        fac_us=SYSCLK/8;                    
        fac_ms=(u16)fac_us*1000;
}
void delay_ms(u16 nms)
{                                     
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
        SysTick->VAL =0x00;           //清空计数器
        SysTick->CTRL=0x01 ;          //开始倒数  
        do
        {
                temp=SysTick->CTRL;
        }
        while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
        SysTick->CTRL=0x00;       //关闭计数器
        SysTick->VAL =0X00;       //清空计数器                      
}  
void delay_us(u32 nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us; //时间加载                           
        SysTick->VAL=0x00;        //清空计数器
        SysTick->CTRL=0x01 ;      //开始倒数          
        do
        {
                temp=SysTick->CTRL;
        }
        while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
        SysTick->CTRL=0x00;       //关闭计数器
        SysTick->VAL =0X00;       //清空计数器         
}

int main(void)
{
        while(1)
        {
                GPIO_SetBits(GPIOD,GPIO_Pin_2);
                delay_us(6);

                GPIO_SetBits(GPIOD,GPIO_Pin_1);
                delay_us(3);

                GPIOD->BSRR = GPIO_Pin_0;
                delay_us(1);

                GPIO_ResetBits(GPIOD,GPIO_Pin_0);
                delay_us(3);

                GPIO_ResetBits(GPIOD,GPIO_Pin_1);
                delay_us(6);

                GPIO_ResetBits(GPIOD,GPIO_Pin_2);
                delay_us(500);       
        }
}
沙发
IJK| | 2013-4-23 17:13 | 只看该作者
1us的脉宽,应该用定时器比较合适点。10us的脉宽,通过GPIO来做可以比较准。

如果1us的脉宽非要通过GPIO来做,直接操作寄存器肯定是必须的,其次delay_us的调用时间也需要考虑,即要减掉。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fireinghost + 1 很给力!
板凳
fengye5340| | 2013-4-23 20:41 | 只看该作者
二楼说的对,用定时器可以实现us的定时。如果楼主需要非常准确,误差5%,最好借用示波器实测,再做参数调整

使用特权

评论回复
地板
LSQHHH| | 2013-4-24 08:40 | 只看该作者
应该用PWM输出,精度可以很高。

使用特权

评论回复
5
fireinghost|  楼主 | 2013-4-24 14:44 | 只看该作者
本帖最后由 fireinghost 于 2013-4-24 14:48 编辑
IJK 发表于 2013-4-23 17:13
1us的脉宽,应该用定时器比较合适点。10us的脉宽,通过GPIO来做可以比较准。

如果1us的脉宽非要通过GPIO来 ...

看了下定时器的资料,如果单做三路脉冲输出是没有问题的,但是我这边需要三路同时输出,而且还要嵌套,这个就比较麻烦了,不知道您有啥好的思路呢?

QQ截图20130424144725.png (2.04 KB )

QQ截图20130424144725.png

使用特权

评论回复
6
IJK| | 2013-4-24 16:07 | 只看该作者
LS的要求可以用:output capture功能,或者PWM

使用特权

评论回复
7
tanmilaoshu| | 2013-4-24 18:12 | 只看该作者
可以用定时器输出1us的PWM波啊?用IO口来实现应该达不到要求吧……

使用特权

评论回复
8
fireinghost|  楼主 | 2013-4-25 08:56 | 只看该作者
IJK 发表于 2013-4-24 16:07
LS的要求可以用:output capture功能,或者PWM

您说的是输出捕获吧?昨天试了下,能做到下降沿对称,但是达不到中心对称,我用的是time4的三个channel来作输出
呵呵,不管怎么样,谢谢您的意见!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝