九齐NY8BE62D软件开发

news2024/12/23 23:14:25

开启100us中断

void Time_Init(void)
{
	DISI();
	//;Initial Timer0
	PCON1 = C_TMR0_Dis; // Disable Timer0
	TMR0 = 100;			// Load 0x00 to TMR0 (Initial Timer0 register)

	T0MD = C_PS0_TMR0 | C_PS0_Div2; 
	INTE = C_INT_TMR0;
	
	PCON1 = C_TMR0_En; // Enable Timer0
	ENI();			   // Enable all unmasked interrupts
}

开启10ms执行一次main函数

void isr(void) __interrupt(0)
{
	if (INTFbits.T1IF)
	{
		INTF = (char)~(C_INT_TMR1); // Clear T1IF flag bit
	}
	if (INTFbits.T0IF)
	{
		INTF = (char)~(C_INT_TMR0); // Clear T0IF flag bit
		TMR0 += 158;
		
		ti16_cnt0++;
		if (ti16_cnt0 > 99)
		{
			ti16_cnt0 = 0;
			time_10ms_flag = 1;
		}
	}
}

void main(void)
{
	GPIO_Init();
	CLRWDT();
	ADC_Init();
	PWM_Init();
	delay(1000);
	Time_Init();

	while (1)
	{
		CLRWDT(); // Clear WatchDog
		if (time_10ms_flag)
		{
			time_10ms_flag = 0;
			//这里面添加要执行的程序
		}
	}
}

ADC初始化

PACON寄存器添加要打开的引脚通道

void ADC_Init(void)
{
	//----- Initial ADC-----
	ADMD = C_ADC_En | C_ADC_CH_Dis | C_Quarter_VDD; // 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_VDD;					// ADC reference high voltage is supplied by internal VDD (Note: ADC clock freq. must be equal or less 2MHz @ VDD=5.0V)
	// ADVREFH = C_Vrefh_4V;					// ADC reference high voltage is supplied by internal 4V  (Note: ADC clock freq. must be equal or less 1MHz)
	ADVREFH = C_Vrefh_3V; // ADC reference high voltage is supplied by internal 3V  (Note: ADC clock freq. must be equal or less 500KHz)
	// ADVREFH = C_Vrefh_2V; // ADC reference high voltage is supplied by internal 2V  (Note: ADC clock freq. must be equal or less 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 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 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 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 2MHz)
									//--------------------------------------------------
	// Set AIN0(PA0) to AIN7(PB2) as pure ADC input for reduce power consumption (SFR "PACON")
	PACON = C_PB0_AIN5 | C_PA1_AIN1; // C_PB2_AIN7 | C_PB1_AIN6 | C_PB0_AIN5 | C_PA4_AIN4 | C_PA3_AIN3 | C_PA2_AIN2 | C_PA1_AIN1 | C_PA0_AIN0;
	// Set AIN8(PB3) as pure ADC input for reduce power consumption (SFR "ADCR")
	ADCR |= C_Sample_8clk | C_12BIT | C_PB3_AIN8; // C_PB3_AIN8 |
	ADMDbits.GCHS = 1;							  // Enable global ADC channel	(SFR "ADMD")
	delay(50);									  // Delay 0.56ms(Instruction clock=4MHz/2T) waiting ADC stable
}

ADC采集函数

ADMD寄存器
在这里插入图片描述在这里插入图片描述
如果采集VDD的话电压要除于4
ch是采集通道
vref是参考电压:C_Vrefh_VDD,C_Vrefh_4V,C_Vrefh_3V,C_Vrefh_2V

unsigned int Get_ADC_Value(unsigned char ch, unsigned char vref) //,unsigned char vref)
{
	unsigned char i = 3;
	unsigned int value = 0, buf, max = 0, min = 0xFFFF;
	ADMD = C_ADC_En | C_ADC_CH_Dis | C_Quarter_VDD;
	ADMD = 0x90 | ch;
	ADVREFH = vref;
	delay(100);
	while (i)
	{
		i--;
		ADMDbits.START = 1; // Start a ADC conversion session
		while (ADMDbits.EOC == 0)
			; // Wait for ADC conversion complete
	}
	value = 0;
	for (i = 0; i < 6; i++)
	{
		ADMDbits.START = 1; // Start a ADC conversion session
		while (ADMDbits.EOC == 0)
			; // Wait for ADC conversion complete
		buf = ADD;
		buf <<= 4;
		buf |= 0x0F & ADR;
		if (max <= buf)
			max = buf;
		if (min >= buf)
			min = buf;
		value += buf;
	}
	value -= max;
	value -= min;
	value >>= 2;
	return value;
}

PWM初始化

引脚对应的pwm几就打开几
我只打开了pwm1和pwm5

void PWM_Init(void)
{
   // Initial Timer 1 & PWM1/2 control register
   TMRH = 0; // C_TMR1_Data_b9 | C_TMR1_Data_b8 | C_PWM2_Duty_b9 | C_PWM2_Duty_b8 ;
   // TM4RH = 0; // C_TMR4_Data_b9 | C_TMR4_Data_b8 | C_PWM3_Duty_b9 | C_PWM3_Duty_b8;
   TM5RH = 0; // C_TMR5_Data_b9 | C_TMR5_Data_b8 | C_PWM5_Duty_b8;

   TMR1 = 0xFF; // Move FFH to TMR1 LB register ( TMR1[9:0]=3FFH )
   // TMR4 = 0xFF;  // Move FFH to TMR4 LB register ( TMR1[9:0]=3FFH )
   TMR5 = 0xFF;  // Move FFH to TMR5 LB register ( TMR1[9:0]=3FFH )
   PWM1DUTY = 0; // Move 01H to PWM1DUTY LB register ( PWM1DUTY[9:0]=001H )
   			  //    PWM2DUTY = 0;			// Move FFH to PWM2DUTY LB register ( PWM2DUTY[9:0]=3FFH )
   			  //    PWM3DUTY = 0;			// Move FFH to PWM3DUTY LB register ( PWM3DUTY[9:0]=300H )
   // PWM4DUTY = 0; // Move FFH to PWM4DUTY LB register ( PWM4DUTY[9:0]=0FFH )
   PWM5DUTY = 0; // Move FFH to PWM5DUTY LB register ( PWM3DUTY[9:0]=100H )

   T1CR2 = C_PS1_Dis | C_TMR1_ClkSrc_Inst;							  // Prescaler 1:1 , Timer1 clock source is instruction clock
   T1CR1 = C_PWM1_En | C_PWM1_Active_Hi | C_TMR1_Reload | C_TMR1_En; // Enable PWM1 , Active_High , Non-Stop mode ,reloaded from TMR1[9:0] , enable Timer1
   //    P2CR1    = C_PWM2_En | C_PWM2_Active_Hi;
   //    P3CR1	 = C_PWM3_En | C_PWM3_Active_Hi;	// Enable PWM3 , Active_High , Non-Stop mode ,reloaded from TMR3[9:0] , enable Timer3
   // T4CR2 = C_PS4_Dis | C_TMR4_ClkSrc_Inst;							  // Prescaler 1:1 , Timer4 clock source is instruction clock
   // T4CR1 = C_PWM4_En | C_PWM4_Active_Hi | C_TMR4_Reload | C_TMR4_En; // Enable PWM4 , Active_High , Non-Stop mode ,reloaded from TMR4[9:0] , enable Timer4
   T5CR2 = C_PS5_Dis | C_TMR5_ClkSrc_Inst;							  // Prescaler 1:1 , Timer5 clock source is instruction clock
   T5CR1 = C_PWM5_En | C_PWM5_Active_Hi | C_TMR5_Reload | C_TMR5_En; // Enable PWM5 , Active_High , Non-Stop mode ,reloaded from TMR5[9:0] , enable Timer5
}

结构体写bit节省空间

8个标志位只占了1个字节

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
// union
//{
typedef struct
{
	unsigned bit0 : 1;
	unsigned bit1 : 1;
	unsigned bit2 : 1;
	unsigned bit3 : 1;
	unsigned bit4 : 1;
	unsigned bit5 : 1;
	unsigned bit6 : 1;
	unsigned bit7 : 1;
} byte;
byte flag_byte = {0}, flag_byte1 = {0};

#define time_10ms_flag flag_byte.bit0
#define power_flag flag_byte.bit1		 // 开关机
#define direction_flag flag_byte.bit2	 // 电机正反转  0正1反
#define volFull_flag flag_byte.bit3		 // 充满
#define heat_mode_count flag_byte.bit4	 // 0关闭  1高档
#define vbat_low_off_flag flag_byte.bit5 // 低电量
#define breath_flag flag_byte.bit6		 // 呼吸灯
#define key_sign flag_byte.bit7

软推pwm实现呼吸灯

把该函数放中断执行就可以了
一旦打开breath_flag呼吸灯开始执行

//***************************呼吸灯程序******************************
void breath_led_func()
{
	static u16 pwm_count = 0;
	static u16 pwm_set = 0;
	static u8 pwm_dir = 1;
	static u8 pwm_set_count = 0;
	if (breath_flag)
	{
		pwm_count++;
		if (pwm_count < pwm_set)
			LED_GREEN = 1;
		else
			LED_GREEN = 0;
		if (pwm_count == 20) // 20*50us=1ms,pwm波频率为 1KHz
		{
			pwm_count = 0;
			pwm_set_count++;
		}
		if (pwm_set_count == 50) // 50ms调整一次占空比,占空比调整频率为20Hz
		{
			pwm_set_count = 0;
			if (pwm_dir == 1)
				pwm_set++;
			else
				pwm_set--;
			if (pwm_set == 20) // 20*500*2ms=2s为一个呼吸周期
				pwm_dir = 0;
			if (pwm_set == 0)
				pwm_dir = 1;
		}
	}
	else
	{
		pwm_count = 0;
	}
}

ADC计算电压方法

电压V = (ad值/(2^adc位数))*参考电压

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文解读|快速可认证的点云配准

原创 | 文 BFT机器人 《TEASER: Fast and Certifiable Point Cloud Registration》是一篇由Yang et al. 在IEEE Transactions on Robotics杂志上发表的研究论文&#xff0c;于2021年4月出版。这篇论文提出了两种快速且可验证的点云配准算法&#xff1a;TEASER和TEASER&#xf…

院线电影票特惠购票系统--竞价分销模式开发

竞价分销模式是一种基于拍卖理论的销售模式&#xff0c;卖家设定一个底价&#xff0c;由买家进行竞价&#xff0c;最终以最高出价者的价格成交。这种模式在电影票销售中的应用可以有效地提高电影院的售票量和收益。在竞价分销模式中&#xff0c;需要开发一个高效的系统来支持这…

VS Code配置Prettier格式化Apex

先决条件 安装nodejs和npm安装vs code安装salesforce extension pack 配置Prettier Apex 创建本地Salesforce项目 (Standard) command shift p -> SFDX: Create Project with Manifest -> Standard 打开terminal运行npm init生成package.json文件 安装prettier ap…

汽车IVI中控开发入门及进阶(十):车载摄像头接口CVBS、AHD和MIPI

文章目录 前言一、CVBS是什么?二、AHD是什么?三、MIPI是什么?前言 汽车电子电气架构正在由传统的分布式架构向域集中式架构转变,也就是将多个应用程序集中在一个域中,正如提到IVI,有些已经开始导入域控,除了一带多的显示屏、一带多的雷达传感器,当然还有一带多的摄像头…

设计HTML5文档结构

定义清晰、一致的文档结构不仅方便后期维护和拓展&#xff0c;同时也大大降低了CSS和JavaScript的应用难度。为了提高搜索引擎的检索率&#xff0c;适应智能化处理&#xff0c;设计符合语义的结构显得很重要。 1、头部结构 在HTML文档的头部区域&#xff0c;存储着各种网页元…

React源码解析18(3)------ beginWork的工作流程

摘要 OK&#xff0c;经过上一篇文章。我们调用了&#xff1a; const root document.querySelector(#root); ReactDOM.createRoot(root)生成了FilberRootNode和HostRootFilber。 并且二者之间的对应关系也已经确定。 而下一步我们就需要调用render方法来讲react元素挂载在ro…

研究:ChatGPT在生成代码方面的准确率比抛硬币还低!

✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社区 &#x1f4d9; 专栏地址&#xff1a;AI大模型 ChatGPT真的能帮助程序员&#xff1f;研究&#…

【Opencv入门到项目实战】(八):图形直方图|傅里叶变换

所有订阅专栏的同学可以私信博主获取源码文件 文章目录 1.图像直方图1.1 直方图计算1.2 分通道读取1.3 mask操作&#xff08;掩码操作&#xff09; 2.傅里叶变换2.1 频率转换结果2.2 高通和低通滤波器 1.图像直方图 1.1 直方图计算 直方图是一种用于可视化数据分布的图表形式…

朋友圈截图生成,制作朋友圈网页

使用教程可以自己看工具的使用手册。 Windows电脑版&#xff1a; https://imageio.jscs.top/zip/wxchat-moment-windows Mac电脑版&#xff1a; https://imageio.jscs.top/zip/wxchat-moment-mac 这款神器的主要功能是朋友圈评论截图生成器&#xff0c;而且还具有以下功能中…

cesium学习记录05-支持的主要数据格式与服务

1. 矢量数据&#xff1a; 1.1. GeoJSON 定义&#xff1a; 一个基于JSON的地理数据格式&#xff0c;Cesium支持GeoJSON的直接加载。 例子&#xff1a; 加载一个简易故宫建筑的GeoJSON数据。 代码&#xff1a; /*** 添加故宫geojson数据*/AddGuGong() {var viewer this.v…

【Linux从入门到精通】文件操作(C语言vs系统调用)

文章目录 一、C语言的文件IO相关函数操作 1、1 fopen与fclose 1、2 fwrite 1、3 fprintf与fscanf 1、4 fgets与fputs 二、系统调用相关接口 2、1 open与close 2、2 write和read 三、简易模拟实现cat指令 四、总结 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍…

AP2915DC-DC降压恒流驱动IC LED电源驱动芯片 汽车摩托电动车灯

AP2915 是一款可以一路灯串切换两路灯串的降压 恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功 率管输出功率可达 12W&#xff0c;电流 1.2A。 AP2915 一路灯亮切换两路灯亮&#xff0c;其中一路灯亮可 以全亮&a…

C++,文本文件,读取文件

代码演示&#xff1a; #include<iostream> using namespace std; #include<string> #include<fstream>void test() {//1、包含头文件//2、创建流对象ifstream ifs;//3、打开文件并判断文件是否成功ifs.open("test.txt", ios::in);if (!ifs.is_ope…

问道管理:A股缩量整理 新股上演久违暴涨模式

周三&#xff0c;大盘低开后震动&#xff0c;三大指数小幅跌落&#xff0c;创业板指相对偏强。 早盘开盘后&#xff0c;沪指、深证成指弱势震动&#xff0c;创业板指探底上升翻红&#xff0c;盘面热门乏善可陈。午后三大指数震动走弱&#xff0c;创业板指再度翻绿。医药板块活…

Vue 实现重定向、404和路由钩子(六)

一、重定向 1.1 修改 Main.vue <template><div><el-container><el-aside width"200px"><el-menu :default-openeds"[1]"><el-submenu index"1"><template slot"title"><i class"…

伪原创神码ai怎么样【php源码】

这篇文章主要介绍了python汉化补丁包下载&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图&#xff1a; ** Spyder汉化&#xff08;python汉化&…

在vue项目使用数据可视化 echarts ,柱状图、折线图、饼状图使用示例详解及属性详解

官网地址&#xff1a;Apache ECharts ​一、下载插件并在页面中引入 npm install echarts --save 页面导入&#xff1a; import * as echarts from echarts 全局导入&#xff1a; main.js 中&#xff0c;导入并注册到全局 import echarts from echarts Vue.prototype.$echart…

【云存储】【腾讯云】【阿里云】【b2】【google drive】【one drive】【s3】【azure】对比

【1】google drive 【2】b2 price 【3】腾讯云对象存储 文档中心 > 对象存储 > 开发者指南 > 对象 > 存储类型 > 存储类型概述 文档中心 > 对象存储 > 购买指南 > 计费项 > 数据取回费用

【计算机组成原理】24王道考研笔记——第四章 指令系统

第四章 指令系统 一、指令系统 指令是指示计算机执行某种操作的命令&#xff0c;是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该 机的指令系统&#xff0c;也称为指令集。 指令格式&#xff1a; 1.1分类 按地址码数目分类&#xff1a; 按指令长度分类&…

AttentionFreeTransformer 源码解析(一):AFTFull、AFTSimple、AFTLocal

我觉得源码写的很好懂&#xff0c;我就不加注释了&#xff0c;直接上计算流程图。 AFTFull class AFTFull(nn.Module):def __init__(self, max_seqlen, dim, hidden_dim64):super().__init__()max_seqlen: the maximum number of timesteps (sequence length) to be fed indim…