zoukankan      html  css  js  c++  java
  • atmega8 例程:T1定时器 快速PWM

    /***************************************************************** 
    * 函数库说明:ATMEGE8 T1定时器 快速PWM
    * 版本: v1.0
    * 修改: 庞辉
    * 修改日期: 2011年08月11日
    *
    * 说明: OC1A 20khz 50%占空比
    * OC1B 10khz 33%占空比
    * 且在溢出中断中频率不断改变
    *
    * 版本更新:
    *
    ******************************************************************
    *注意:快速PWM模式 WGM1=5,6,7,14,15
    * 单斜波计数,用于输出高频率的PWM信号(比双斜波的高一倍频率)
    * 都有TOV1溢出中断,发生于TOP时
    * 比较匹配后可以产生OCF1x比较匹配中断.
    * WGM1=5时, 最大值为0x00FF, 8位分辨率
    * WGM1=6时, 最大值为0x01FF, 9位分辨率
    * WGM1=7时, 最大值为0x03FF,10位分辨率
    * WGM1=14时,最大值由ICF1设定, TOP时产生ICF1输入捕捉中断 (单缓冲)
    * WGM1=15时,最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断(双缓冲,但OC1A将没有PWM能力,最多只能输出方波)
    * 改变TOP值时必须保证新的TOP值不小于所有比较寄存器的数值
    * 注意,即使OCR1A/B设为0x0000,也会输出一个定时器时钟周期的窄脉冲,而不是一直为低电平
    * 计算公式:fPWM=fclk_IO/(N*(1+TOP))
    *****************************************************************
    */

    #include <avr/io.h>
    #include <avr/interrupt.h>

    int main(void)
    {
    //PB1 PB2 设置为输出模式
    DDRB |= (1 << DDB1) | (1 << DDB2);

    //PWM周期计数器
    ICR1 = 300;
    //PB1占空比计数器,占空比50%
    OCR1A = 150;
    //PB2占空比计数器,占空比50%
    OCR1B = 100;

    //OC1A OC1B起始高电平电平
    TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);

    //使能溢出中断
    //TIMSK |= (1 << TOIE1);

    //开总中断
    //sei();

    //OC1A OC1B 快速PWM,TOP值为ICR1,不分频,PWM启动
    TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10);

    while(1);

    return 0;
    }

    volatile unsigned int i = 0;

    //定时器1溢出中断
    SIGNAL(SIG_OVERFLOW1)
    {
    i++;

    //3秒
    if(i == 60000)
    {
    i = 0;
    ICR1 += 50;
    }

    if(ICR1 == 500)
    {
    ICR1 = 300;
    }
    }



  • 相关阅读:
    使用 requests 维持会话
    使用 requests 发送 POST 请求
    使用 requests 发送 GET 请求
    requests 安装
    使用 urllib 分析 Robots 协议
    使用 urllib 解析 URL 链接
    使用 urllib 处理 HTTP 异常
    使用 urllib 处理 Cookies 信息
    使用 urllib 设置代理服务
    按单生产程序发布
  • 原文地址:https://www.cnblogs.com/pang123hui/p/2309865.html
Copyright © 2011-2022 走看看