历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2019年10月17日 | ATMEGA16单片机Timer1的OC1A脚输出占空比可调的PWM信号

发布者:SereneNature 来源: 51hei关键字:ATMEGA16  单片机  Timer1  占空比  PWM信号 手机看文章 扫描二维码
随时随地手机看文章

采用快速PWM方式,通过按键设置OCR1A的值,从而改变占空比;

当数值超出界限时,以了LED和LCD的方式报警;

输出经过滤波可以得到直流信号,改变占空比,输出不一样。

仿真原理图如下
0.png 

单片机源程序如下:


#define MAIN_C

#include "includes.h"

/***************************/

/*PWM*/

/*晶振为4MHz*/

/*利用Timer1的OC1A脚输出占空比可调的信号*/

/*通过按键控制OCR1A的值*/

/***************************/


#define PwmOut     PD5     //A通道的PWM输出

#define OCR        OCR1A

#define KeyUp      PA0     //增大PWM值的按键

#define KeyDown    PA1     //减小PWM值的按键

#define Above      PA2     //设置位值过高指示

#define Below      PA3     //设置位值过低指示

#define STEP       64      //定义按键时的步进值

int OcrReg = 1024;         //OCR1A初始值

int Icr1Reg = 0x7ff;       //PWM的计数顶部值  Icr1Reg = 2047

//unsigned char *show = "0000"; 

unsigned char temp;


void init(void)   //初始化函数

{

    //比较匹配时清零,计数到最大时置位OC1A

    TCCR1A |= (1<    //11位分辨率,快速PWM模式,使用系统时钟作为计数时钟

    TCCR1B |= (1<    ICR1   = Icr1Reg;  

    OCR    = 0 ;

    DDRD  |= (1<    DDRA  |= (1<    DDRA  &= ~((1<    PORTA |= (1<    PORTA |= (1<    //TIMSK |= (1<    //SREG  |= (1<<7);   //开全局中断

}


void  ShowValue(int value)

{

    unsigned char *temp = "0000";

    temp[0] = value/1000 + 0x30;

    value = value%1000;

    temp[1] = value/100 +0x30;

    value = value%100;

    temp[2] = value/10 + 0x30;

    value = value%10;

    temp[3] = value + 0x30;  

    ClearLine(2);

    LCD_DisplayString(2,1,"OCR1A = ");

    LCD_DisplayString(2,9,temp);  

}


void main(void)

    unsigned char i; 

    init();

    Init_LCD();

    OCR = OcrReg;

    LCD_DisplayString(1,1,"PWM test");

    LCD_DisplayString(2,1,"OCR1A = ");

    ShowValue(OcrReg);

    while(1)

    {                

        if(!(PINA&(1<        {

            delay_nms(10);    //按键消抖

            if(!(PINA&(1<            {

                while(!(PINA&(1<                if(OcrReg >= (Icr1Reg+1))

                {

                    for(i=0;i<5;i++)

                    {

                        PORTA ^= (1<                        delay_nms(200);

                    }

                    ClearLine(2);

                    LCD_DisplayString(2,1,"Value MAX!");

                }

                else

                {

                    PORTA |= (1<                    OcrReg += STEP;                    

                    OCR = OcrReg;

                    ShowValue(OcrReg);

                }

            }

        }

        if(!(PINA&(1<        {

            delay_nms(10);    //按键消抖

            if(!(PINA&(1<            {

                while(!(PINA&(1<                if(OcrReg <= 0)

                {

                    for(i=0;i<5;i++)

                    {

                        PORTA ^= (1<                        delay_nms(200);

                    }

                     ClearLine(2);

                    LCD_DisplayString(2,1,"Value MIN!");

                }

                else

                {

                    PORTA |= (1<                    OcrReg -= STEP;

                    OCR = OcrReg;

                    ShowValue(OcrReg);

                }

            }

        }       

    }

}



//比较中断子程序,可以用来产生正弦波

/*#pragma vector = TIMER1_COMPA_vect

    __interrupt void CompA_isr( void ) 

{

    

    OcrReg =  st[j];

    OCR = OcrReg;  

    j++;  

    if(j>88)

    {

        j = 0;

    }

}*/



关键字:ATMEGA16  单片机  Timer1  占空比  PWM信号 引用地址:ATMEGA16单片机Timer1的OC1A脚输出占空比可调的PWM信号

上一篇:AVR单片机ATmega16之初识PWM模式
下一篇:AVR单片机简单计算器的Proteus仿真实现+源码

推荐阅读

万物互联和万物智能得以实现,核心推动力量来自半导体产业,数百亿智能设备连接网络,用于数据采集的物联网芯片和高性能AI芯片需求剧增,因万物互联采集海量数据,经数据中心构造的云端对数据进行处理,从而带动整个半导体发展,依据Gartner分析数据显示,物联网的半导体市场将高达340亿美元,芯片厂商是这个时代最大受益者。   从云端到网络,再到现...
刚开始学的时候,8位的timer0和timer2用的比较熟练,timer1一直迷迷糊糊。于是找了一些书籍,好心人把原理图翻译成了中文,易懂推荐《AVR单片机菜鸟进阶》沈添国主编 这是我好不容易从两本书上找到的中英文的对照图 这是我在课本上找的,共用寄存器部分的图,学到这里就一下子通了 还有一个要注意的点就是:timer1的时钟源选择是靠TCCR1B来控...
稍早前,华为官方发布Mate 40系列手机预热海报,公布新机部分外观。根据海报,华为Mate 40系列没有延续上一代Mate机型的圆形摄像模组设计,而变得有棱角,像是八边形设计。随着Mate 40系列外观的关注度不断上升,相关信息也持续流出。综合多个数码博主爆料,华为Mate 40系列或将后置对称式五摄像头,可能会有两个方向的设计应用在不同型号中。据爆料,...
日经亚洲近日专访了日本半导体供应商瑞萨的高管,谈及了公司的未来发展的总体规划。据日经亚洲评论10月13日报道,瑞萨高管Sailesh Chittipeddi向记者透露,虽然公司依然坚持芯片自主制造计划,但先进工艺节点会选择外包给台积电等代工厂。他说:“从长远来看,更先进的节点我们将不得不依赖第三方,对于任何比成熟工艺的40纳米更高级的芯片,我们都必须依...

史海拾趣

问答坊 | AI 解惑

眼泪哗哗地

应该照顾照顾我们业余爱好者和初学者,才是真正的是和谐、平民化,老少通吃/…

查看全部问答∨

急啊

各位大哥大姐们,谁有调频接收机的设计啊 接收机可以接收到的无线电波的频率范围称为接收机的工作频率范围或波段覆盖。 已知条件:直流电源+6V,主要元器件有17.8MHZ晶振、10.7MHZ中频变压器、6.5MHZ中频变压器,3DG100晶体管及FS2204集成块。 ...…

查看全部问答∨

一种大功率宽频带低损耗定向耦合器的设计与实现

根据传输线变压器串并联同时耦.-flu原理,设计了一种1 3 dB铁氧体定向耦合器,该定向耦合器是用漆包线绕在射频铁氧体磁芯上做成。具有尺寸小、结构简单和频带宽等优点,工作范围在1 O0~400MHz。对其参数进行了理论计算和测量,满足设计要求。经过 ...…

查看全部问答∨

嵌入式好不好学?

我之前一点都没有接触过嵌入式,对于硬件和操作系统方面也不是很了解,就是比较熟悉C语言方面的知识。 现在我要开始学习嵌入式了,在外面报了一个培训班!对于像我这样零基础,从头开始的初学者来说,嵌入式好不好学呢?现在真的有点迷茫呢! 各 ...…

查看全部问答∨

USB驱动的疑问

书上说 USB主端叫Host 从端叫Function 因此对应的驱动分别叫做USB Host Driver及USB Function Driver 如果我现在的Wince设备只做主端,是不是就不需要USB Function Driver了?…

查看全部问答∨

帮忙看个程序。急用!!!

大家好:    为什么实型变量输出时报错?如下程序。 #include<stdio.h> #include<stdlib.h> #define PI 3.14 double b; main() { SCON=0X50; TMOD=0X20; TH1=0X3f; TR1=1; TI=1; b=4.678; printf("%f",b); ...…

查看全部问答∨

UART串口编程如何才能稳定工作在461538的波特率下?

大家好,我现在有一个获取UART格式输出的图像数据的项目,我用一个USB转串口芯片将设备与电脑相连,初步的设备访问已经能够完成(如设置寄存器),但是当我开始让设备输出图像时,我就无法获得每一次的数据,基本上只有在开始能读到一部分不完整的数据,后面 ...…

查看全部问答∨

外部中断

我写了一个程序,一个按键作为外中断,发觉可能由于按键抖动,按一次执行了好多次外中断函数,怎么解决啊?中断为下降沿触发,void EXTI9_5_IRQHandler(void){  if(EXTI_GetITStatus(EXTI_Line7)!=RESET) {  i1 ...…

查看全部问答∨

【UART1】如何收到完整的内容后再发送数据

最近在用STM8s103进行串口通讯调试。 使用UART1,利用中断进行收发,主要代码(中断处理部分)如下/*发送中断处理代码*/ @interrupt void USART_TX(void) {     /* 将一个字节写入发送寄存器,并将发送缓冲区指针向后移动一个字节 ...…

查看全部问答∨

stm32f103开发板哪个公司的好?

                                 我想学学 ARM7 ,不知道哪个公司的开发板质量好,资料全,请大家给我推荐一款?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved