ch32v003邏輯分析儀波形

只是一個普通的翻轉(zhuǎn)

??

/**********************************?(C)?COPYRIGHT?*******************************
?*?File?Name??????????:?main.c
?*?Author?????????????:?WCH
?*?Version????????????:?V1.0.0
?*?Date???????????????:?2023/12/22
?*?Description????????:?Main?program?body.
?*********************************************************************************
?*?Copyright?(c)?2021?Nanjing?Qinheng?Microelectronics?Co.,?Ltd.
?*?Attention:?This?software?(modified?or?not)?and?binary?are?used?for
?*?microcontroller?manufactured?by?Nanjing?Qinheng?Microelectronics.
?*******************************************************************************/
/*
?*@Note
?*GPIO?routine:
?*PD0?push-pull?output.
?*
*/
#include?"debug.h"
/*?Global?define?*/
/*?Global?Variable?*/
/*********************************************************************
?*?@fn??????GPIO_Toggle_INIT
?*
?*?@brief???Initializes?GPIOA.0
?*
?*?@return??none
?*/
void?GPIO_Toggle_INIT(void)
{
????GPIO_InitTypeDef?GPIO_InitStructure?=?{0};
????RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,?ENABLE);
????GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_1;
????GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_Out_PP;
????GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_50MHz;
????GPIO_Init(GPIOC,?&GPIO_InitStructure);
}
/*********************************************************************
?*?@fn??????main
?*
?*?@brief???Main?program.
?*
?*?@return??none
?*/
int?main(void)
{
????u8?i?=?0;
????NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
????SystemCoreClockUpdate();
????Delay_Init();
#if?(SDI_PRINT?==?SDI_PR_OPEN)
????SDI_Printf_Enable();
#else
????USART_Printf_Init(115200);
#endif
????printf("SystemClk:%d\r\n",?SystemCoreClock);
????printf(?"ChipID:%08x\r\n",?DBGMCU_GetCHIPID()?);
????printf("GPIO?Toggle?TEST\r\n");
????GPIO_Toggle_INIT();
????while(1)
????{
????????Delay_Ms(250);
????????GPIO_WriteBit(GPIOC,?GPIO_Pin_1,?(i?==?0)???(i?=?Bit_SET)?:?(i?=?Bit_RESET));
????}
}

ms級看還正常,

image.png

但是us級,上升沿這個為什么要多一個這出來,每個上升沿都有,小白的我 ds18b20 us控制異常,是不是要加外圍電阻電容呀image.png

您好,我這邊測試us級的翻轉(zhuǎn)也是沒問題的,你可以提高邏輯分析儀采樣率試一下。正常若使用DS18B20模塊,直接連應(yīng)該是沒問題的。若需要可以留個郵箱,發(fā)你個DS18B20的程序參考一下。后續(xù)若有問題,也可以通過郵箱(lzs@wch.cn)和我溝通。


代碼我從stm32f103寫好能跑,后面又放air001上跑,都o(jì)k,代碼我感覺應(yīng)該沒啥問題,哎,中午的代碼和邏輯分析儀啥都沒動,us級現(xiàn)在沒問題了,奇怪,output切input又有問題了,郵箱地址:個人信息保護(hù),已隱藏 ,先感謝大佬發(fā)程序參考。


您好,已發(fā)郵箱,請查收


這大概率不是芯片問題,而是接線和邏輯分析儀問題。

截圖里ms級信號明顯問題一樣,兩個上升沿有三個像素,解碼的reset也斷開了。


這種問題大概率是信號在邊沿處引發(fā)的振鈴。提高邏輯分析儀采樣率是沒用的,想要觀察振鈴現(xiàn)象,最好用示波器看波形,或者Saleae Logic一類帶模擬輸入的邏輯分析儀觀察。振鈴在使用長杜邦線一類比較隨便的連接時尤其嚴(yán)重。


解決辦法可以想wch-link-E一樣,在線上串個電阻,或者把?GPIO_Speed_50MHz 改小試試。



#include?"ds18b20.h"
float?Temperature?=?0;
uint8_t?Temp_byte1,?Temp_byte2;
uint16_t?TEMP;

void?Set_Pin_Output(GPIO_TypeDef?*GPIOx,?uint16_t?GPIO_Pin)?{
	GPIO_InitTypeDef?GPIO_InitStruct?=?{?0?};
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,?ENABLE);
	GPIO_InitStruct.GPIO_Pin?=?GPIO_Pin;
	GPIO_InitStruct.GPIO_Mode?=?GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed?=?GPIO_Speed_50MHz;
	GPIO_Init(GPIOx,?&GPIO_InitStruct);
}

void?Set_Pin_Input(GPIO_TypeDef?*GPIOx,?uint16_t?GPIO_Pin)?{
	GPIO_InitTypeDef?GPIO_InitStruct?=?{?0?};
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,?ENABLE);
	GPIO_InitStruct.GPIO_Pin?=?GPIO_Pin;
	GPIO_InitStruct.GPIO_Mode?=?GPIO_Mode_IPU;
	GPIO_Init(GPIOx,?&GPIO_InitStruct);
}

uint8_t?DS18B20_Presence(void)?{
	uint8_t?pulse_time?=?0;

	/*?主機(jī)設(shè)置為上拉輸入?*/
	Set_Pin_Input(DS18B20_PORT,?DS18B20_PIN);

	/*?等待存在脈沖的到來,存在脈沖為一個60~240us的低電平信號
	?*???如果存在脈沖沒有來則做超時處理,從機(jī)接收到主機(jī)的復(fù)位信號后,會在15~60us后給主機(jī)發(fā)一個存在脈沖
	?*/
	while?(GPIO_ReadInputDataBit(?DS18B20_PORT,?DS18B20_PIN)?&&?pulse_time?<?100)?{
		pulse_time++;
		Delay_Us(1);
	}
	/*?經(jīng)過100us后,存在脈沖都還沒有到來*/
	if?(pulse_time?>=?100)
		return?1;
	else
		pulse_time?=?0;

	/*?存在脈沖到來,且存在的時間不能超過240us?*/
	while?(!GPIO_ReadInputDataBit(?DS18B20_PORT,?DS18B20_PIN)
			&&?pulse_time?<?240)?{
		pulse_time++;
		Delay_Us(1);
	}
	if?(pulse_time?>=?240)
		return?1;
	else
		return?0;
}
uint8_t?DS18B20_Init(void)?{
	Set_Pin_Output(DS18B20_PORT,?DS18B20_PIN);

	GPIO_SetBits(?DS18B20_PORT,?DS18B20_PIN);

	DS18B20_Rst();

	return?DS18B20_Presence();
}
void?DS18B20_Rst(void)?{
	/*?主機(jī)設(shè)置為推挽輸出?*/
	Set_Pin_Output(DS18B20_PORT,?DS18B20_PIN);

	GPIO_ResetBits(?DS18B20_PORT,?DS18B20_PIN);
	/*?主機(jī)至少產(chǎn)生480us的低電平復(fù)位信號?*/
	Delay_Us(750);

	/*?主機(jī)在產(chǎn)生復(fù)位信號后,需將總線拉高?*/
	GPIO_SetBits(?DS18B20_PORT,?DS18B20_PIN);

	/*從機(jī)接收到主機(jī)的復(fù)位信號后,會在15~60us后給主機(jī)發(fā)一個存在脈沖*/
	Delay_Us(15);
}



/*
???*?從DS18B20讀取一個bit
?*/
static?uint8_t?DS18B20_ReadBit(void)
{
????uint8_t?dat;

????/*?讀0和讀1的時間至少要大于60us?*/
????Set_Pin_Output(DS18B20_PORT,?DS18B20_PIN);
????/*?讀時間的起始:必須由主機(jī)產(chǎn)生?>1us?<15us?的低電平信號?*/
????GPIO_ResetBits(?DS18B20_PORT,?DS18B20_PIN);;
????Delay_Us(10);

????/*?設(shè)置成輸入,釋放總線,由外部上拉電阻將總線拉高?*/
???Set_Pin_Input(DS18B20_PORT,?DS18B20_PIN);
????//Delay_Us(2);

????if(?GPIO_ReadInputDataBit(?DS18B20_PORT,?DS18B20_PIN)?==?SET?)
????????dat?=?1;
????else
????????dat?=?0;

????/*?這個延時參數(shù)請參考時序圖?*/
????Delay_Us(45);

????return?dat;
}


/*
?*?從DS18B20讀一個字節(jié),低位先行
?*/
static?uint8_t?DS18B20_ReadByte(void)
{
????uint8_t?i,?j,?dat?=?0;

????for(i=0;?i<8;?i++)
????{
????????j?=?DS18B20_ReadBit();
????????dat?=?(dat)?|?(j<>1;
????????/*?寫0和寫1的時間至少要大于60us?*/
????????if?(testb)
????????{
????????????GPIO_ResetBits(?DS18B20_PORT,?DS18B20_PIN);;
????????????/*?1us?<?這個延時?<?15us?*/
????????????Delay_Us(8);

????????????GPIO_SetBits(?DS18B20_PORT,?DS18B20_PIN);;
????????????Delay_Us(58);
????????}
????????else
????????{
????????????GPIO_ResetBits(?DS18B20_PORT,?DS18B20_PIN);;
????????????/*?60us?<?Tx?0?<?120us?*/
????????????Delay_Us(70);

????????????GPIO_SetBits(?DS18B20_PORT,?DS18B20_PIN);;
????????????/*?1us?<?Trec(恢復(fù)時間)?<?無窮大*/
????????????Delay_Us(2);
????????}
????}
}

/**
?*?@brief??跳過匹配?DS18B20?ROM
?*?@param??無
?*?@retval?無
?*/
static?void?DS18B20_SkipRom?(?void?)
{
???DS18B20_Rst();

???DS18B20_Presence();

???DS18B20_WriteByte(0XCC);????????/*?跳過?ROM?*/
}


/**
?*?@brief??執(zhí)行匹配?DS18B20?ROM
?*?@param??無
?*?@retval?無
?*/
static?void?DS18B20_MatchRom?(?void?)
{
???DS18B20_Rst();

???DS18B20_Presence();

???DS18B20_WriteByte(0X55);????????/*?匹配?ROM?*/
}


/*
*?存儲的溫度是16?位的帶符號擴(kuò)展的二進(jìn)制補(bǔ)碼形式
*?當(dāng)工作在12位分辨率時,其中5個符號位,7個整數(shù)位,4個小數(shù)位
*
*?????????|---------整數(shù)----------|-----小數(shù)?分辨率?1/(2^4)=0.0625----|
*?低字節(jié)??|?2^3?|?2^2?|?2^1?|?2^0?|?2^(-1)?|?2^(-2)?|?2^(-3)?|?2^(-4)?|
*
*
*?????????|-----符號位:0->正??1->負(fù)-------|-----------整數(shù)-----------|
*?高字節(jié)??|??s??|??s??|??s??|??s??|????s???|???2^6??|???2^5??|???2^4??|
*
*
*?溫度?=?符號位?+?整數(shù)?+?小數(shù)*0.0625
*/
/**
?*?@brief??在跳過匹配?ROM?情況下獲取?DS18B20?溫度值
?*?@param??無
?*?@retval?溫度值
?*/
float?DS18B20_GetTemp_SkipRom?(?void?)
{
???uint8_t?tpmsb,?tplsb;
???short?s_tem;
???float?f_tem;

???DS18B20_SkipRom?();
???DS18B20_WriteByte(0X44);??????????????/*?開始轉(zhuǎn)換?*/

???DS18B20_SkipRom?();
???DS18B20_WriteByte(0XBE);??????????????/*?讀溫度值?*/

???tplsb?=?DS18B20_ReadByte();
???tpmsb?=?DS18B20_ReadByte();

???s_tem?=?tpmsb<<8;
???s_tem?=?s_tem?|?tplsb;

???if(?s_tem?<?0?)?????/*?負(fù)溫度?*/
???????f_tem?=?(~s_tem+1)?*?0.0625;
???else
???????f_tem?=?s_tem?*?0.0625;

???return?f_tem;
}


/**
?*?@brief??在匹配?ROM?情況下獲取?DS18B20?溫度值
?*?@param??ds18b20_id:用于存放?DS18B20?序列號的數(shù)組的首地址
?*?@retval?無
?*/
void?DS18B20_ReadId?(?uint8_t?*?ds18b20_id?)
{
???uint8_t?uc;

???DS18B20_WriteByte(0x33);???????//讀取序列號

???for?(?uc?=?0;?uc?<?8;?uc?++?)
?????ds18b20_id?[?uc?]?=?DS18B20_ReadByte();
}


/**
?*?@brief??在匹配?ROM?情況下獲取?DS18B20?溫度值
?*?@param??ds18b20_id:存放?DS18B20?序列號的數(shù)組的首地址
?*?@retval?溫度值
?*/
float?DS18B20_GetTemp_MatchRom?(?uint8_t?*?ds18b20_id?)
{
???uint8_t?tpmsb,?tplsb,?i;
???short?s_tem;
???float?f_tem;


???DS18B20_MatchRom?();????????????//匹配ROM

???for(i=0;i<8;i++)
???????DS18B20_WriteByte?(?ds18b20_id?[?i?]?);

???DS18B20_WriteByte(0X44);????????/*?開始轉(zhuǎn)換?*/


???DS18B20_MatchRom?();????????????//匹配ROM

???for(i=0;i<8;i++)
???????DS18B20_WriteByte?(?ds18b20_id?[?i?]?);

???DS18B20_WriteByte(0XBE);????????/*?讀溫度值?*/

???tplsb?=?DS18B20_ReadByte();
???tpmsb?=?DS18B20_ReadByte();


???s_tem?=?tpmsb<<8;
???s_tem?=?s_tem?|?tplsb;

???if(?s_tem?<?0?)?????/*?負(fù)溫度?*/
???????f_tem?=?(~s_tem+1)?*?0.0625;
???else
???????f_tem?=?s_tem?*?0.0625;

???return?f_tem;
}

代碼貼這里給有需要的人


5樓說的振鈴現(xiàn)象現(xiàn)象,有時候有,有時候沒有,現(xiàn)在溫度能讀了,感覺波型跟網(wǎng)上的不太一樣
image.png


image.png


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频