九齐单片机NY8B062D 之PWM
今天第一次调试pwm的时候 在改变占空比上折腾了会,也没看寄存器就直接开干了 后面发现占空比一直调节不下来,看寄存器后才发现 占空比调节的最高两位是TMRH控制的。
1: 怎么改变占空比
TMR29 - 28
TMR19- 18 原厂的人粗心
2:开启pwm
=========================================================================*/
#include <ny8.h>
#include "ny8_constant.h"
unsigned int R_AIN2_DATA=0;
unsigned char R_AIN2_DATA_LB=0; unsigned int R_AIN3_DATA=0;
unsigned char R_AIN3_DATA_LB=0; unsigned int R_Quarter_VDD_DATA=0 ;
unsigned char R_Quarter_VDD_DATA_LB=0; unsigned int D_PWM2_DUTY=0X00;#define UPDATE_REG(x) __asm__("MOVR _" #x ",F")
//unsigned int
#define C_PWM_LB_DUTY_00H 0x00 //0x00
#define C_PWM_LB_DUTY_40H 0xA0
#define C_PWM_LB_DUTY_01H 0x01
#define C_PWM_LB_DUTY_FFH 0x01void F_AIN2_Convert(char);
void F_AIN3_Convert(char);void F_Quarter_VDD_Convert(char);
void F_wait_eoc(void);
void delay(int);void main(void)
{//----- Initial GPIO-----//1 IOSTA = C_PA0_Input; // Set PortA as input port//1 IOSTA = C_PA1_Input; // Set PortA as input port IOSTA = C_PA2_Input | C_PA3_Input ; // Set PortA as input port// IOSTA = C_PA3_Input ; // Set PortA as input port IOSTB = C_PB1_Output;PORTA = 0xFF; // PortA Data Register = 0xFFPORTBbits.PB1 = 1;INTE = 0x00; // INTE = 0x00//----- Initial ADC-----
//1 ADMD = C_ADC_En | C_ADC_CH_Dis | C_ADC_PA0 ; // Enable ADC power, Disable global ADC input channel, Select PA0 pad as ADC input (SFR "ADMD")ADMD = C_ADC_En | C_ADC_CH_Dis | C_ADC_PA2 | C_ADC_PA3 ; // Enable ADC power, Disable global ADC input channel, Select PA0 pad as ADC input (SFR "ADMD")//----- ADC high reference voltage source select-----ADVREFH = C_Vrefh_4V; // ADC reference high voltage is supplied by internal 4V (Note: ADC clock freq. must be equal or less than 1MHz)//ADVREFH = C_Vrefh_3V; // ADC reference high voltage is supplied by internal 3V (Note: ADC clock freq. must be equal or less than 500KHz)//ADVREFH = C_Vrefh_2V; // ADC reference high voltage is supplied by internal 2V (Note: ADC clock freq. must be equal or less than 250KHz)//----- ADC clock frequency select---------------------------- //ADR = C_Ckl_Div1; // ADC clock=Fcpu/1, Clear ADIF, disable ADC interrupt //ADR = C_Ckl_Div2; // ADC clock=Fcpu/2, Clear ADIF, disable ADC interrupt ADR = C_Ckl_Div8; // ADC clock=Fcpu/8, Clear ADIF, disable ADC interrupt //ADR = C_Ckl_Div16; // ADC clock=Fcpu/16, Clear ADIF, disable ADC interrupt //----- ADC Sampling pulse width select------------- ADCR = C_Sample_1clk | C_12BIT; // Sample pulse width=1 adc clock, ADC select 12-bit conversion ( Note: ADC clock freq. must be equal or less than 500KHz)//ADCR = C_Sample_2clk | C_12BIT; // Sample pulse width=2 adc clock, ADC select 12-bit conversion ( Note: ADC clock freq. must be equal or less than 1MHz)//ADCR = C_Sample_4clk | C_12BIT; // Sample pulse width=4 adc clock, ADC select 12-bit conversion ( Note: ADC clock freq. must be equal or less than 1.25MHz)//ADCR = C_Sample_8clk | C_12BIT; // Sample pulse width=8 adc clock, ADC select 12-bit conversion ( Note: ADC clock freq. must be equal or less than 2MHz) // Initial Timer 1/2 & PWM1/2 control register TMRH = C_TMR2_Data_b9 | C_TMR2_Data_b8 | C_PWM2_Duty_b9 | C_PWM2_Duty_b8;TMR2 = 0xFF; // Move FFH to TMR2 LB register ( TMR2[9:0]=3FFH )// PWM2DUTY = C_PWM_LB_DUTY_FFH; // Move FFH to PWM2DUTY LB register ( PWM2DUTY[9:0]=3FFH )T2CR2 = C_PS2_Dis | C_TMR2_ClkSrc_Inst; // Prescaler 1:1 , Timer2 clock source is instruction clockT2CR1 = C_PWM2_En | C_PWM2_Active_Hi | C_TMR2_Reload | C_TMR2_En; // Enable PWM2 , Active_High , Non-Stop mode ,reloaded from TMR2[9:0] , enable Timer2TMRH = TMRH & 0XF3;
//--------------------------------------------------
//1 PACON = C_PA0_AIN0 | C_PA1_AIN1; // Set AIN0(PA0) as pure ADC input for reduce power consumption (SFR "PACON")PACON = C_PA2_AIN2 | C_PA3_AIN3; // Set AIN0(PA0) as pure ADC input for reduce power consumption (SFR "PACON") ADMDbits.GCHS = 1; // Enable global ADC channel (SFR "ADMD")delay(50); // Delay 0.56ms(Instruction clock=4MHz/2T) for waiting ADC stable while(1){CLRWDT(); // Clear WatchDogR_AIN2_DATA=R_AIN2_DATA_LB=R_Quarter_VDD_DATA=R_Quarter_VDD_DATA_LB=R_AIN3_DATA=R_AIN3_DATA_LB =0x00; F_AIN2_Convert(8); // execute AIN0 ADC converting 8 timesR_AIN2_DATA <<= 4; // R_AIN0_DATA shift left 4 bitR_AIN2_DATA_LB &= 0xF0; // Only get Bit7~4R_AIN2_DATA += R_AIN2_DATA_LB; // R_AIN0_DATA + R_AIN0_DATA_LBR_AIN2_DATA >>=3; // R_AIN0_DATA divided 8F_AIN3_Convert(8); // execute AIN0 ADC converting 8 timesR_AIN3_DATA <<= 4; // R_AIN0_DATA shift left 4 bitR_AIN3_DATA_LB &= 0xF0; // Only get Bit7~4R_AIN3_DATA += R_AIN3_DATA_LB; // R_AIN0_DATA + R_AIN0_DATA_LBR_AIN3_DATA >>=3; // R_AIN0_DATA divided 8F_Quarter_VDD_Convert(8); // execute 1/4VDD input channel ADC converting 8 timesR_Quarter_VDD_DATA <<= 4; // R_Quarter_VDD_DATA shift left 4 bitR_Quarter_VDD_DATA_LB &= 0xF0; // Only get Bit7~4R_Quarter_VDD_DATA += R_Quarter_VDD_DATA_LB; R_Quarter_VDD_DATA + R_Quarter_VDD_DATA_LBR_Quarter_VDD_DATA >>=3; // R_Quarter_VDD_DATA dividing 8TMRH = 0X04; //设置 pwm的9-8位PWM2DUTY = R_AIN2_DATA / 4;//设置PWM的7-0位 2的10次方(pwm的值/1024) }
}//----- Sub-Routine -----
void F_AIN2_Convert(char count)
{char i;//1ADMD = 0x90 | C_ADC_PA0; // Select AIN0(PA0) pad as ADC inputADMD = 0x90 | C_ADC_PA2; // Select AIN0(PA0) pad as ADC inputfor(i=1;i<=count;i++){ ADMDbits.START = 1; // Start a ADC conversion sessionF_wait_eoc(); // Wait for ADC conversion completeR_AIN2_DATA_LB += ( 0x0F & ADR); R_AIN2_DATA += ADD; }
}void F_AIN3_Convert(char count)
{char i;//ADMD = 0x90 | C_ADC_PA1; // Select AIN0(PA0) pad as ADC inputADMD = 0x90 | C_ADC_PA3; // Select AIN0(PA0) pad as ADC inputfor(i=1;i<=count;i++){ ADMDbits.START = 1; // Start a ADC conversion sessionF_wait_eoc(); // Wait for ADC conversion completeR_AIN3_DATA_LB += ( 0x0F & ADR); R_AIN3_DATA += ADD; }
}void F_Quarter_VDD_Convert(char count)
{char i;ADMD = 0x90 | C_Quarter_VDD; // Select internal 1/4VDD as ADC inputfor(i=1;i<=count;i++){ ADMDbits.START = 1; // Start a ADC conversion sessionF_wait_eoc(); // Wait for ADC conversion complete R_Quarter_VDD_DATA_LB += ( 0x0F & ADR); R_Quarter_VDD_DATA += ADD; }
}void F_wait_eoc(void)
{while(ADMDbits.EOC==0);
}void delay(int count)
{int i;for(i=1;i<=count;i++);
}
九齐单片机NY8B062D 之PWM相关推荐
- 九齐单片机NY8B062D开发笔记(一)准备
九齐单片机开发笔记 前言 过程 1.芯片介绍 2.开发环境: 3.例程template 4.源文件: 参考资料 前言 各位朋友们,由于九齐的仿真器买不到,这个系列暂时停止更新 由于价格和性能的追求,近 ...
- 九齐单片机 NY8B062D 之TIM0的使用
1:基础知识. (官方都提供了 整理一下是为了方便以后开发的时候查看) 2:寄存器的了解 2.1 TOMD 2.2 对于 TOMD寄存器的配置 //;------------------------- ...
- 九齐单片机NY8B062D单按键控制4种LED状态
/* =========================================================================* Project: 单按键控制4种LED状态* ...
- 密脚九齐单片机 SSOP20 NY8BM72A 2K ROM 九齐
NY8BM72A 是以MTP作为记忆的8bit低单价九齐单片机,有18个IO口,12+1AD通道,2K ROM,4组计时器,3组PWM,3组蜂鸣器, 系統主頻提供 20.8M/19.2M/16M/14 ...
- NY8B062D 九齐单片机之ADC(采样值不准的解决办法)
其实ADC的程序 官方已经给出了 如下 ( 写这篇文章的目的是 就是本人在使用的时候 发现采样的数值 每次在接收采样值 必须要清零 要不然到处漂 ) 下面一段时间官方的程序 我就在上面加了个pwm的测 ...
- 九齐单片机NY8A051D程序之 PWM Output
这个例程原本就是九齐的IDE自带的,我这里傻瓜式的操作给大家看看,另外附带他的源码,没有用的给删了,需要注意的是,这芯片C指令51单片机有那么一点点区别,PWM输出或者做那种进入低功耗的案子,都一定要 ...
- 九齐单片机应用-小家电开发(1)
** 锂电类便携式小家电应用开发-打蛋器 1:应用需求:PWM输出,复位电压2.7V,重启电机电压3.0V 2:结合需求,选用九齐系列单片机中的051F作为主控芯片,配合9017给锂电进行充电. 3: ...
- NY8A051F 6 I/O 8-bit EPROM-Based MCU 台湾九齐单片机
NY8A051F 功能简介 NY8A051F 可以说是台湾九齐的人气王,有硬件PWM,有LVD,有38K红外载波,有各种模式 NY8A051F 宽广的工作电压: NY8A051F 2.0V ~ 5.5 ...
- 九齐单片机 NY8A051D点亮LED
写在前面 这段时间接触九齐的051D,记录一下怎么快速入门这款单片机 定时器 跟普通的8051单片机使用方法类似,直接上代码: #include <ny8.h> #include &quo ...
最新文章
- Matlab R2018a 中文版安装教程(同时适用于大部分其他版本)
- 无法远程访问Mysql的解决方案
- Java-ReentrantLock初探
- mysql真的不能做搜索引擎吗?
- 游戏中的卡片模态面板设计【1】—运用案例分析
- pfile文件怎么恢复格式_回收站清空的文件怎么恢复?值得收藏的恢复方法
- com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。
- Kamailio 简介
- ClickHouse内核分析-MergeTree的Merge和Mutation机制
- day39-Spring 05-Spring的AOP:不带有切点的切面
- java8循环_Java8里请不要再使用循环语句
- 安卓选择多张图片上传_微信7.0.5更新!安卓客户端领先ios发布,新增多项实用功能...
- c语言字符串汇编,C语言调用汇编实现字符串对换
- 关于Mac电脑更新IP地址的解决方法!
- [bzoj2594][Wc2006]水管局长数据加强版
- Java Lambda
- linux修改vcf编码格式,VCF乱码终极解决大法
- 跟着海盗头子创业是一种怎样的体验?
- 阿拉丁2021年度小程序白皮书发布,凡泰极客 FinClip 技术再度入选(内附完整白皮书下载)
- 【图像分割】基于计算机视觉实现视网膜图像中的血管分割附matlab代码