首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pwm值不变

pwm值不变
EN

Stack Overflow用户
提问于 2014-01-21 07:52:09
回答 1查看 404关注 0票数 0

我已经为Atmega128编写了一个脉宽调制代码。我是使用快速脉宽调制模式与非逆变脉冲在比较匹配,我需要改变的OCR0值在特定的时间。但它并没有改变。有人知道这里有什么问题吗?

代码语言:javascript
复制
#include <avr/interrupt.h>
#include <avr/io.h>



uint8_t tick_1sec;



void timer1_init(void) // 1 second timer
{
    OCR1A = 15624;

    TIMSK |= (1<<OCIE1A);
    TCCR1B = (1<<WGM12);        //CTC mode
    TCCR1B |= (1<<CS12)|(0<<CS11)|(1<<CS10);    
}



ISR(TIMER1_COMPA_vect)  //1 second interrupt
{
    cli();
    tick_1sec = 1;
    sei();          
}



void timer0_init(void) // fast pwm with OC0 non-inverting mode
{
    TCCR0 = (1<<FOC0)|(1<<WGM01)|(1<<WGM00);
    TCCR0 |= (1<<COM01)|(0<<COM00);
    TCCR0 |= (1<<CS02)|(1<<CS01)|(1<<CS00);
    OCR0 = 63;
    TIMSK |= (1<<OCIE0);
}



int main(void)
{
    uint8_t t = 0;

    DDRB = 0xFF;

    timer0_init();      
    timer1_init();
    sei();

    while(1){

        if (tick_1sec)
        {
            tick_1sec = 0;
            t++;
            if (t == 10){
                OCR0 = 127;
            }
            else if (t == 20){
                OCR0 = 191;
            }
            else if (t == 30){
                OCR0 = 63;
                t = 0;
            }
        }
    }

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-21 18:18:30

要检查的事情:

我建议将tick_1sec声明为volatile,以防止编译器对寄存器进行超优化。

你的时钟频率是多少?只有当您的CPU频率为16 ISR (==> 16.000.000 / 1024 / 15624)时,ISR才能提供1s呼叫。

您可能在您的硬件中有一个发光二极管,您可以从a) ISR b)在main中的第一个if ()中倒转,看看是否达到了这个目标。

更新:“易失性”

他在评论中提供的链接非常值得一读。

使用Atmel Studio时,使用/不带volatile关键字编译一次代码,并比较编译器正在执行的==>解决方案资源管理器/输出文件/ *.lss .您将看到每个C语句以及编译器如何将其转换为机器代码.当你和微卫星一起工作时,一次有价值的练习.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21252174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档