avr频率占空比可调波形输出子函数

#ifndef _KPWM_H_

#define _KPWM_H_

/*************avr频率占空比可调波形输出子函数**************/

////作者:王泡泡

///形参:Fclk赋值设定频率(单位为k)  范围:  1K 到 256K

///      rat设定占空比(单位为百分比)eg:40 则输出方波占空比为百分之四十

//频率误差小于2%,占空比误差小于5%

//PWM频率计算公式为f=fox/N(1+TOP) fox为晶振频率 N为分频系数 TOP为计数计数最大值

//TOP的反算公式为TOP=FOX/NFclk-1

//在15模式下计数最大值为OCR1A

//比较值放在OCR1B

//15模式下时钟1到达OCR1B时OC1B脚跳变

//而OC1A脚以两倍Fclk输出占空比为50%方波

//这里默认的晶振频率是12M的,实际得根据自己MCU修改

//

void KPWM(unsigned char fcq,unsigned char rat)

{

unsigned int f,r;

DDRD|=0X30;//设置PD4 PD5为第二功能脚 分别为OC1B OC1A

TCCR1A|=(0<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);//WGM13:0 = 15,15模式: 比较匹配时OC1A 取反,OC1B 为低电平

TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS10);// 在这决定了1分频 0X19

f=12000/fcq;//计算最大值,因为输出单位为KHZ的方波,故12 000 000去除后面3个0

f=f/1;

f=f-1;

r=f;

r=r/10;

r=r*rat; //计算比较值,实质是除以100,防止溢出吧

r=r/10;

OCR1A=f;

OCR1B=r;

}

void KPWM_MODE14(unsigned char fcq,unsigned char rat1,unsigned char rat2)

{

unsigned int f,r1,r2;

DDRD|=0X30;//设置PD4 PD5为第二功能脚 分别为OC1B OC1A

TCCR1A|=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(0<<WGM10);//WGM13:0 = 14,14模式: 比较匹配时OC1A 清零即为低电平,OC1B 为低电平

TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS10);// 在这决定了1分频 0X19

f=12000/fcq;//计算最大值,因为输出单位为KHZ的方波,故12 000 000去除后面3个0

f=f/1;

f=f-1;

r1=f;

r1=r1/10;

r1=r1*rat1; //计算比较值,实质是除以100,防止溢出吧

r1=r1/10;

r2=f;

r2=r2/10;

r2=r2*rat2; //计算比较值,实质是除以100,防止溢出吧

r2=r2/10;

ICR1=f;

OCR1A=r1;

OCR1B=r2; //此处方向自己决定吧,记得要验证

}

#endif

时间: 2024-10-08 10:08:39

avr频率占空比可调波形输出子函数的相关文章

(原创)基于MCU的频率可调,占空比可调的PWM实现(MCU,MCS-51/MSP430)

1.Abstract     做这个是受朋友之邀,用在控制电机转动的方面.他刚好在一家好的单位实习,手头工作比较多,无暇分身,所以找我帮忙做个模型.要求很明晰,PWM的频率在0~1KHz范围内,占空比0~99%范围内,二者均可调.抄下指标以后,回到实验室,细细分析以后,决定用MCU来实现一下,毕竟只分析,无实际结果也不是一个好的交代. 2.Content   2.1 理论分析     归根结底来说,是一个时序逻辑,即PWM输出波形是随着时间的推移而变化.用时序图的方式解释更明晰些. FIG2.1

AVR单片机教程——PWM调光

PWM 两位数码管的驱动方式是动态扫描,每一位都只有50%的时间是亮的,我们称这个数值为其占空比.让引脚输出高电平点亮LED,占空比就是100%. 在驱动数码管时,我们迫不得已使占空比为50%,因为不能让两位真正同时地显示不同的数字.但是,我们也可以有意地让LED的占空比不到100%,以降低其亮度. 占空比是可以用程序来调节的.下面的程序允许用户用按键调整蓝色LED的占空比,并通过数码管来显示. #include <ee1/ee.h> #define DUTY_MAX 9 int main()

【MATLAB】画信号频谱的子函数

输入信号序列和采样率,该子函数可以画出该信号的频谱图. function [f,spec,NFFT]=spec_fft_plot(sample,L,Fs) % 输入数据说明: % sample:信号序列: % L:信号序列的长度: % Fs:该信号的采样频率. % 输出数据说明: % f:频率: % spec:频谱图纵坐标: NFFT = 2^nextpow2(L); % NFFT = L; spec=abs(fft(sample,NFFT)./L); flag = 1; if flag ==1

tcl脚本学习十:proc 子函数的使用

lesson 10 :proc 子函数的使用 1. proc sum {arg1 arg2} { set x [expr $arg1+$arg2]; return $x } puts " The sum of 2 + 3 is: [sum 2 3]\n\n" //[语法] :proc procName { var1 var2 ... } {body}说明:1. proc 命令有三个参数:procName 是定义的过程名字:{var1 var2 ...}是输入.输出参数列表:body 是

Shell 语法 if 、 case 、for 、 while、 until 、select 、repeat、子函数

if语法 : if [ expression ]    then   commandselif [ expression2 ]   then   commandselse   commandsfi case 语法: case string1 in   str1)    commands;;   str2)    commands;;   *)    commans;;esac 循环语句 for 语法:    for  var in list do commands done     在此形式时,

子函数的讨论

#include<stdio.h> #include<stdlib.h> void swap(int *p,int *q) { int *m; *m=*p; *p=*q; *q=*m; } main() { int a,b; scanf("%d,%d",&a,&b); swap(&a,&b); printf("%d,%d",a,b); } 1,2 2,2请按任意键继续. . . [Warning] C:\Use

利用F#编写、理解Y组合子函数

赵劼的博客<使用Lambda表达式编写递归函数>中用C#实现了为函数求出 Y 组合子的函数.C#代码生涩,难以阅读,原代码如下: static Func<T, TResult> Fix<T,TResult>(Func<Func<T, TResult>, Func<T, TResult>> f) { return x => f(Fix(f))(x); } static Func<T1, T2, TResult> Fix

关于子函数返回字符串问题集锦

Case1: #include<stdio.h> #include<string.h> #include<stdlib.h> char* getMem(void) { char p[] = "hello world";//这样子定义可以输出,但输出乱码. p[5] = 0x0; return p; } int main() { char *s="fzz"; s=getMem(); printf("%s\n",s

使用任意波形(或函数)发生器产生想要的任意信号

使用任意波形(或函数)发生器产生想要的任意信号 1.说明 本文主要记述,本人使用Tektronix(泰克)公司的  AFG3101 型号的任意函数发生器(Arbitrary Function Generator,AFG) 和 AWG520 型号的任意波形发生器(Arbitrary Waveform Generator,AWG)的一些经验方法,如有不当,还请指出,谢谢! 2.生成任意波形 主要有两种方法生成,一是使用 Tektronix(泰克)提供的 ArbExpress 软件创建生成波形,二是使